• 九、面向对象 之 继承


    1、继承特点

    • 单根性:子类只能有一个父类
    • 传递性:子类可以间接继承父类的父类

    2、继承语法

    class 子类 : 父类
    {
        // ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 栗子
    // 超类:人
    class Person
    {
        public string Name;
        public int Age;
    
        public void Speak()
        {
            Console.Write("我叫{0},今年{1}岁。", Name, Age);
        }
    }
    
    // 子类:老师(老师也是人,具备人的特征和行为,故直接继承超类Person,省略重复的编码)
    class Teacher : Person
    {
        public string Subject; // 教学科目
    
        // 上课
        public void ClassBegin() {
            Speak();
            Console.WriteLine("我是你们的{0}老师,现在开始上课。", Subject);
        }
    }
    
    // 某方法内↓↓↓
    Teacher tec = new Teacher();
    tec.Name = "Mr.Bai";
    tec.Age = 24;
    tec.Subject = "C/C++/Java/C#";
    tec.ClassBegin(); // 我叫Mr.Bai,今年24岁。我是你们的C/C++/Java/C#老师,现在开始上课。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    3、里氏替换原则:is / as

    3.1、概念

    • 任何父类出现的地方,子类都替代
    • 语法表现:父类对象装载子类对象(父类声明,子类创建
    • 作用:方便对象管理和存储
    // 使用2里面的栗子
    Person person = new Teacher();
    // 但是父类不能直接点子类的特征和行为,请继续看3.2
    
    • 1
    • 2
    • 3

    3.2、isas 关键字

    • is:判断一个对象是否是指定类型的对象
      • 返回 bool
      • 栗子:Console.WriteLine(tec is Person); // True
    • as:将一个对象转换为指定类对象
      • 返回 指定类型对象 or null
      • 栗子:Teacher teacher = person as Teacher;
    • is 和 as 通常是配合使用的
    if(person is Teacher){
        // 第一种写法
        Teacher t = person as Teacher;
        t.ClassBegin();
    
        // 第二种写法
        (person as Teacher).ClassBegin();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4、继承中的构造函数:base

    4.1、要点

    除了 关键字 不同,其他都是各门语言相通的

    • 子类可以通过 base 关键字 调用父类构造

    4.2、base 关键字

    • 父类有无参构造子类构造则可不写 base,否则必写,不然怎么先实例化父类呢
    // 超类:人
    class Person
    {
        public string Name;
        public int Age;
        
        // 父类构造
        public Person(string name, int age){
            // ...
        }
    }
    
    // 子类:老师
    class Teacher : Person
    {
        public string Subject; // 教学科目
        
        // 子类构造
        public Teacher(string name, int age, string subject) : base(name, age)
        {
            // ...
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    5、object 和 装箱拆箱

    5.1、object

    • 关键字:object,是 Object 的别名
      • 所有类的基类
    • 作用
      • 可以用里氏替换原则,用 object 装所有对象
      • 可以用来表示不确定的形参类型

    5.2、装箱拆箱

    • 装箱:用 object 存值类型
      • 把值类型用引用类型存储,栈内存会迁移到堆内存
    • 拆箱:把 object 转回值类型
      • 把引用类型的值取出来,堆内存会迁移到栈内存
    • 利弊
      • 好处:不确定类型可以方便值的存储和传递
      • 坏处:存在内存迁移,增加性能消耗

    6、密封类:sealed

    • 关键字:secled
    • 作用:修饰类,让类无法再继承(类似java的final)
  • 相关阅读:
    Microsoft.IO.RecyclableMemoryStream源码解读
    BUUCTF-MISC1
    kaldi 报错:data/lang/L_disambig.fst is not olabel sorted
    序列化推荐与社会化推荐的区别
    深度学习中语义分割、实例分割、目标检测和图像分类区别
    Part2_扩展MATSIM_Subpart3_个人汽车交通_第15章 道路收费
    java+jsp基于ssm的校园OTO超市系统-计算机毕业设计
    【无标题】
    Linux下,查看 可执行文件 依赖的 动态库的几个方法
    requests请求douban.com获得网页源代码
  • 原文地址:https://blog.csdn.net/qq_30769437/article/details/128169742