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;

 

 说白了,里氏转换就是换汤不换药,强转的前提是父类对象里装的是子类对象,就相当于儿子穿着爹的衣服,里氏转换就是脱了父亲的衣服现出原形。

 

五、结语

  其实继承的内容也不是很多,但是作为面向对象设计的重要部分,我们必须花费大量的时间了解其中的设计机制,给读者的一个建议是多敲代码尝试一下!

六、补充

  类中的私有成员是无法在外界访问的,把成员设计为私有就意味着只作用于类的内部。

 

posted @   Darius丶段  阅读(67)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示