接口继承自System.Object吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口继承自System.Object吗?相关的知识,希望对你有一定的参考价值。
参考技术A 很久没有自己写随笔了, 工作太忙。 最近有学生问我问题,接口是否继承自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,否则就违反了单一继承的定律。本回答被提问者采纳
C#中的继承
按照我个人的理解,继承和实现接口不是一个概念,结构和类型都可以实现接口,枚举不能。
话说,结构可以继承吗?
先梳理一下C#中的继承关系,如下图:
class => [BaseClass =>] System.Object
struct => System.ValueType => System.Object
enum => System.Enum => System.ValueType => System.Object
C#中的所有类型,结构和枚举都是直接或间接继承自Object的。
一般定义一个类型可以这样写 class MyClass : Object { } 但是一般情况下,直接继承自Object都可以省略不写,直接写成这样 class MyClass { } 效果是完全一样的。
而所有的结构都是继承自ValueType,这是一个继承自Object的抽象类,但是我们自己写代码的时候不能写上这个继承关系,同样,我们也不可以定义一个类型继承自ValueType。
所有枚举都是继承自Enum,这是一个继承自ValueType的抽象类,同样我们在写代码的时候不能写上这个继承关系,我们自己也不能定义一个类型或结构是继承自Enum的。
可以说ValueType和Enum类都是.NET的私货,只允许他自己继承,不允许我们来继承。
我们编写代码的时候可以定义一个枚举继承自Int32或Byte,但是即使你这样写了,这个枚举类型还是继承自Enum,而你定义的Int32或Byte只是给枚举成员做一个范围限制。
综上所述,类型,结构和枚举都能继承,但是结构不能自定义继承,枚举的自定义继承实际上不是继承;
而能被继承的只能是类型。
再回到问题上,结构可以继承吗?
答案是可以继承,但是不可以被继承。
以上是关于接口继承自System.Object吗?的主要内容,如果未能解决你的问题,请参考以下文章