接着上章:
代码如下-
class NameList { public string Name { get; set; } public void ID() => Console.WriteLine($"我的id是{Name}"); } class A : NameList { public A() => Console.WriteLine("这是A类的初始化,也就是构造函数"); } class B : NameList { public B() => Console.WriteLine("这是A类的初始化,也就是构造函数"); }
我们 来探讨一下 继承的类的使用
这个是A类的标准实例化方式。
var a = new A { Name = "实例后,Name是新赋值" }; a.ID();
结果:
A类的启动顺序没有问题。
1,构造函数,
2,赋值
3 ID方法
没一点问题。
但是! 我们来思考一下,在NameList中的方法和属性都是需要实例化才能使用的
继承之后实例化子类【派生类【AB两个类就是】】,怎么就能使用NameList呢?
这一次我们探讨一下继承的时候,类的启动顺序。也是实例化顺序。
为了简单我们再次修改全体代码:
给NameList一个构造函数。
class NameList { public NameList() => Console.WriteLine("这个是NameList的构造函数"); public string Name { get; set; } public void ID() => Console.WriteLine($"我的id是{Name}"); } class A : NameList { public A() => Console.WriteLine("这是A类的初始化,也就是构造函数"); } class B : NameList { public B() => Console.WriteLine("这是A类的初始化,也就是构造函数"); }
我们再次实例化A类 代码和上面的实例化A一模一样,就不再重复了
我们直接看结果:
原来如此,为什么不实例化NameList类,就能使用其中的属性和方法【明面不实例化】
我们知道了 继承的实例化顺序:
1 实例化父类
2 实例化子类
那么 我们再来探讨释放类的顺序吧。 我们再来改造一下 代码: 添加析构函数。
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"); }
还是实例化A,代码一样,直接看结果。
我们来看一下啊 先释放谁:
通过Debug类,我们可以看到析构函数的启动顺序,
1 子类
2 父类
和构造函数正好相反!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/12731.html