很久没有自己写随笔了, 工作太忙。 最近有学生问我问题,接口是否继承自System.Object? 我经过一些推断就断定不是。
他给我一篇文章,上面通过代码的分析得出的结论也不是。不过我觉得好像把一个简单的问题搞复杂了,下面我介绍一下我的
推断,提供参考和一种解决问题的思维方法。
首先我们从C++说起, c++可以多继承。也就是一个类型 --- class,可以继承自2个以上的父类型。多继承导致一个问题,
很多人知道。例如,如果类型B,类型C均继承自类型A。然后类型D继承自类型B和C。那么构造D的实例的时候,由于要调用
父类型的构造方法,最终会调用两次A的构造方法。结果类型D的实例有两套祖父的数据,也就是外公和爷爷长的一模一样,
以后使用的时候很麻烦。每次D要和祖父打交道,都要额外的区分到底是外公还是爷爷。 再说,内存里面出现两套一模一样的
东西,一个用不上,还容易引起混乱,岂不是浪费,又麻烦。
所以,java就通过严格的单一继承规则解决了这个问题。.net当然也一样,单一集成是一个定律。那么有:
所有的类型 --- 只能继承自单一的类型;
其次,大家知道,从一个Type派生的必然是另一个Type。 System.Object是一个Type,如果interface继承自System.Object,
那么interface必然是一个Type。
那么,如果一个类型实现了一个interface,再有一个基类class, 那么它们的根源都是System.Object, 也即是这个类的实例也像
c++一样,存在上述的问题。 因此接口肯定不是继承自System.Object,否则就违反了单一继承的定律。