本章节继续讲实现继承。
微信
密封类和密封方法框架
密封类和方法的概念很简单,就是为了避免容许类和方法被继承和扩展。不容许扩展通常的缘由有:ide
.Net库有不少密封类,使用者不能随意扩展。我猜想这么作多是由于设计者想保持框架的纯净性和单一性,即不但愿使用者随意扩展而致使出现众多“分支框架”,最终的致使框架的碎片化(参考Andriod的碎片化)。
最典型的,string类型就是密封类。咱们能够猜想扩展方法的出现(.Net3.5版本)就是由于对.Net框架密封类有扩展的需求,可是密封类没法继承,因此出一个扩展方法做为“补偿办法”,必定程度上解决了对基础框架的扩展问题。函数
密封类案例 /// <summary> /// 密封类案例:不能被继承,其方法不能被override。这个类同时仍是基类 /// </summary> public sealed class SaUser { public void Test() { //密封类方法不能有virtual关键字,由于virtual表明可override,这和密封类的概念矛盾了 } /// <summary> /// 此写法为非法,不一样经过编译: 基类中不能定义密封方法 /// </summary> public sealed override void Test2() { //Test2()不能定义sealed,也不能定义sealed override,都会致使编译异常。 } } 密封方法案例 /// <summary> /// 普通基类 /// </summary> public class SaUser2 { public virtual void Test() { //可扩展的方法 } } /// <summary> /// 派生类的密封方法 /// </summary> public class SaUserChilid : SaUser2 { /// <summary> /// 密封方法必须是重写的方法 /// </summary> public sealed override void Test() { //密封方法必须同时有sealed和override关键字 base.Test(); } }
有趣的现象
如上代码,有个有趣的现象是,定义密封类只须要使用sealed关键字,而定义密封方法时,sealed必须和override配对使用。同时,在基类中也不能对方法实行密封。为何会这样呢?我猜测,设计者的观点应该是:“所谓密封,应该是对一个原先处于“开放”状态下的类进行密封”。但对密封的这个限制,确实使得语言特性不够灵活。实际上,对基类的方法进行密封,虽然极少发生,但理论上仍是有需求的。this
派生类的构造函数设计
前面咱们讲过了单个类的构造函数。咱们知道构造函数是必须的,当咱们没有类的构造函数时,系统会默认提供一个构造函数,由于类中字段的数据初始化是依赖于构造函数的。
当咱们还要构造较为复杂的派生类时,其构造函数如何运行,就成为一个很是值得研究的问题。研究清楚了它,你才能用“合适”的办法完成派生类的初始化。派生类的构造函数的麻烦,来自于类的“多构造函数”,也就是构造函数的重载。
首先,咱们要知道构造函数的原则:3d
在以上原则下,当一个派生类要开始构造时,咱们发现,关键要注意什么?是构造链不能断!在这点上编译器会智能判断,若是它发现构造链断了,会发生编译错误。咱们能够看个例子,这个例子我之前的文章就贴过。code
/// <summary> /// 基类 /// </summary> class Line { private int thick; /// <summary> /// 基类构造方法:代号A /// </summary> Line() { thick = 1; } } /// <summary> /// 派生类 /// </summary> public class Rect { private int width; private int height; /// <summary> /// 构造方法:代号B /// </summary> /// <param name="length"></param> Rect(int length) :this(length, length) //初始化器 { //构造一个正方形 } /// <summary> /// 构造方法:代号C /// </summary> /// <param name="width"></param> /// <param name="height"></param> Rect(int width, int height) :base() //初始化器 { //构造一个长方形 this.width = width; this.height = height; } }
我给代码中的构造方法都加了代号。以上的demo,咱们能够分析得出,若是使用B方法来构造对象,它的构造链是:A->C->B。若是用C方法来构造对象,构造链是:A->C。构造链是清晰的,就没有问题。
对象
重申一下何为修饰符:应用于类型或者成员的关键字。blog
可见性修饰符
不能把类型定义为protected,private,protected interval。嵌套类除外,由于类成员可使用访问限制性修饰符,而嵌套类是和类的成员同等级的。
其余修饰符
讲完继承,下篇开始讲解接口。
欢迎关注本人微信公众号,更及时的关注最新文章(每周多篇原创文章,以及多篇专题文章):
扫描二维码关注