c#面向对象的三大特征之----继承
摘要:经过长时间的探讨跟实践之后,总算是搞懂了继承的特点,下面说一下个人的一些看点。
一、什么是继承?
假如我有一个Person类,类中有下面的一些成员
public class Person { public int age; public string name; private string sex; public void Show() { Console.WriteLine("我是人"); } }
现在我想写一个教师类,教师同样有age、name、sex等属性,那么我需要像Person那样重新声明一个新的类吗?大可不必。
首先,这样写的代码看起来十分冗余。其次,当类中的成员很多时,这样写很浪费时间。继承就是为了避免出现这样的情况。
public class Teacher : Person { }
二、继承的主要作用
1、使程序的创建和维护变得很容易;
2、有利于代码的重用和节省时间;
3、编写时候可以更快的理解和应用;
三、override、new关键字
教师类继承自Person类,现在教师类拥有父类所有的成员,但是教师类不想用父类的方法,怎么办?两种方法,在方法名之前加override或者new。
override是重写,即将父类的方法在子类里直接抹去重新写,调用的方法就是子类方法;而new只是将父类的方法在子类里隐藏起来,故而调用的仍旧是父类方法。
使用override的限制条件是父类的方法必须声明为virtual虚方法。
public virtual void ParVirMethod() { Console.WriteLine("父类的方法..."); } public override void ParVirMethod() { Console.WriteLine("子类1的方法..."); } public new void ParVirMethod() { Console.WriteLine("子类2的方法..."); }
当然声明为virtual不代表一定要override重写,重写的权限在子类,就像子类2就没有重写,它只是加了个new关键字来隐藏父类的方法。
四、里氏转换(难点)
里氏转换就是父类转换为子类。在这之前先说明一下,父类可以接收子类的实例对象,就是如下p2,声明的是Person类型,指向的却是new Teacher开辟的地址:
Person p1 = new Person();
Person p2 = new Teacher();
p2.age =18;
p2.name ="张三";
Console.WriteLine(p1.GetType());
Console.WriteLine(p2.GetType());
此时p2的实际类型为Teacher,可以字段赋值,注意:这些字段不是Person类里的,而是Teacher里的,因为你真正指向的是new Teacher开辟的内存空间,
是不是有点搞不懂?没事,还有更复杂的问题。假如出现下面这种情况:子类拥有父类所有的成员,但是子类还可以自己声明成员,就像Teacher类还有个object课程字段,
那我new了一个Teacher实例是不是也分配了一段地址用来存放object,那我可以像age、name那样直接给object赋值吗?答案是不可以。为什么?
因为p2压根不知道Teacher有object这个属性,它只知道Teacher实例中继承自Person类的成员,所以,无法直接调用。
此时,里氏转换重大登场,父类转换为子类去调用子类的成员。例如:
Teacher teacher = (Teacher)p2; teacher.obj = "计算机"; Console.WriteLine($"姓名{teacher.name} 年龄 {teacher.age} 课程 {teacher.obj}");
声明一个Teacher类对象 teacher 来接收通过里氏转换强转的p2;
说白了,里氏转换就是换汤不换药,强转的前提是父类对象里装的是子类对象,就相当于儿子穿着爹的衣服,里氏转换就是脱了父亲的衣服现出原形。
五、结语
其实继承的内容也不是很多,但是作为面向对象设计的重要部分,我们必须花费大量的时间了解其中的设计机制,给读者的一个建议是多敲代码尝试一下!
六、补充
类中的私有成员是无法在外界访问的,把成员设计为私有就意味着只作用于类的内部。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异