image.png

现象上的继承

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Car car = new Car();
  6. Type name = typeof(Car);
  7. Type fName = name.BaseType;
  8. Type GFName = fName.BaseType;
  9. Console.WriteLine(name.FullName);
  10. Console.WriteLine(fName);
  11. Console.WriteLine(GFName);
  12. Console.WriteLine(car is Object);
  13. }
  14. }
  15. class Vehicle
  16. {
  17. }
  18. class Car : Vehicle
  19. {
  20. }

单根的

  • 所有类的父类只能有一个,
  • Object类(public)是祖爷爷,所有类的父类

    is a 是一个

  • 从语义上说,子类实例必然是父类实例

     Console.WriteLine(car is Object);
    
  • 但是相反则不可。举个例子,一个汽车必然是交通工具,但一个交通工具不一定是汽车

小知识点

  • sealed 结扎类,无法被继承

25讲-继承 - 图3

  • 子类的访问权限不能超越父类

public>internal
image.png

  • 类成员的访问权限不能超越类


本质上的继承

定义:完整继承父类已有的成员(构造函数和析构函数除外),对成员进行横向和纵向的拓展

  • 横向上:增加成员数量
  • 纵向上:重写,覆盖等,多态性

调用顺序

父类的构造函数->子类的构造函数
image.png

类成员的访问级别

public

所有都可访问

protected

仅限子类访问成员,可跨程序集 护犊子
25讲-继承 - 图6
image.png

internal

仅限在本程序集使用
25讲-继承 - 图8
image.png

private

仅限该类体内访问,默认级别
image.png

protected internal两者为或的关系

25讲-继承 - 图11

base

    class Vehicle
    {
        private string _owner;
        public Vehicle()
        {
            this.Owner = "M";
        }
        public string Owner { get; set; }
    }
    class Car : Vehicle
    {
        public Car()
        {
            this.Owner = "LIU";
        }
        public void ShowOwner()
        {
            Console.WriteLine(base.Owner);  //base只能访问上一级父类的成员
        }
    }
  public Student(int age,string name,int id) :base(age,name)
        {
            this.Id = id;
        }