C# 继承(3)
接上章代码:
class NameList { public NameList() => Console.WriteLine("这个是NameList的构造函数"); ~NameList() => Debug.WriteLine("释放NameList"); public string Name { get; set; } public void ID() => Console.WriteLine($"我的id是{Name}"); } class A : NameList { public A() => Console.WriteLine("这是A类的初始化,也就是构造函数"); ~A() => Debug.WriteLine("释放A"); } class B : NameList { public B() => Console.WriteLine("这是A类的初始化,也就是构造函数"); ~B() => Debug.WriteLine("释放B"); }
实例化:
var a = new A { Name = "实例后,Name是新赋值" }; a.ID();
上章 我们说过 实例化A类的时候先会实例化NameListlei,也就是先实例化父类,在实例化子类。而且还是隐式的。
那么显示是什么样子的呢?
我们来修改代码:
注意看A类,B类的 构造函数
class NameList { public NameList() => Console.WriteLine("这个是NameList的构造函数"); ~NameList() => Debug.WriteLine("释放NameList"); public string Name { get; set; } public void ID() => Console.WriteLine($"我的id是{Name}"); } class A : NameList { public A():base() => Console.WriteLine("这是A类的初始化,也就是构造函数"); ~A() => Debug.WriteLine("释放A"); } class B : NameList { public B() : base() => Console.WriteLine("这是A类的初始化,也就是构造函数"); ~B() => Debug.WriteLine("释放B"); }
这里 我们使用的Base关键字。
Base:父类,基类
使用方式有很多种,但是在子类的构造函数中使用方式是:Base()这个样子的。
我们先不讨论别的是Base使用方式,还是在构造函数的上面做功夫。
我们探讨一下 重载构造函数
我们来修改代码:
注意AB两个类的重载函数,一个具有Base,一个没有
class NameList { public NameList() => Console.WriteLine("这个是NameList的构造函数"); public NameList(string Name) => Console.WriteLine($"这个是NameList的重载构造函数,输入的参数是{Name}"); ~NameList() => Debug.WriteLine("释放NameList"); public string Name { get; set; } public void ID() => Console.WriteLine($"我的id是{Name}"); } class A : NameList { public A() : base() => Console.WriteLine("这是A类的初始化,也就是构造函数"); public A(string Name) : base(Name) =>Console.WriteLine($"这个是A的重载构造函数,输入的参数是{Name}"); ~A() => Debug.WriteLine("释放A"); } class B : NameList { public B() : base() => Console.WriteLine("这是A类的初始化,也就是构造函数"); public B(string Name) => Console.WriteLine($"这个是B的重载构造函数,输入的参数是{Name}"); ~B() => Debug.WriteLine("释放B"); }
实例化代码:
var a = new A("ABC"); var b = new B("DEF");
结果:
emm,这下子就明白了,重载的构造函数如果不指定Base是不会实例父类的重载函数。只会执行默认的构造函数。注意Base在使用的时候的传参,是直接填入参数。
子类的重载构造函数实例化时必须要实例化父类的重载构造函数的关键要素有:
1 父类和子类必须要相同的重载构造函数
2 子类必须指定Base
3 传参是实参