Interface继承至System.Object?

简介:

  这其实是个很基础的问题,在我们学习C#类型的时候第一句就是所有的对象都继承至System.Object。今天一个同事问我Interface继承之System.Object。所以才有了本文。

  在这里我只从几个方面简单的说明:

  1:从语义:

     Interface在oo中表示一组行为的集合,是高层次的抽象,契约,一种稳定的表现。好比我们生活的公司和员工之间的合同,双方都必须遵循。所以我们的接口必须是一个干净纯洁的体系。加入interface继承之System.Object,这以为这是不是,Interface有Equal,ToString等方法?这明显破坏了接口的干净体系。

2:实践(C#):

   如果interface继承之System.Object,这我们可以从System.Type获取其基类:

如下测试:

public interface Itest{}

public class test{}

typeof(Itest).BaseTye//为null

typeof(test).BaseType//System.Object.

3:我们从IL指令来看(这也是最有力的证明):

我们先写一个接口和一个类,他们都是空实现:

namespace ConsoleApplication1 

    public class test 
    { 
    }

    public interface Itest 
    { 
    } 
}

 

在反编译查看IL:

test clas:

image

而interface Itest的IL:

image

从上面两个IL比较我们可以清晰的看出来class有显示的extends [mscorlib]System.Object,而接口没有,本篇的答案到这里你应该很清晰吧。这里还需要说明的是他们都是class,说明都是一种类型,而interface是一种特殊的类型。

接口能定义什么?接口能定义行为(方法),无参属性(属性,又称守信),有参属性(索引),不能定义私例字段,定义都是对编译器都是一组方法行为。

   在最后我们在来说说前面说的“所有的对象都继承至System.Object”,这是真的嘛?在c#的编译过程中为我们提供了一个选项NOAUTOINHERIT,是的我们可以为自定义类型去掉默认的System.Object的基类。这就打破了System.Object创世之祖的戒律。




 本文转自 破狼 51CTO博客,原文链接:http://blog.51cto.com/whitewolfblog/873348,如需转载请自行联系原作者


相关文章
|
9月前
|
Kotlin
Kotlin中继承、类型转换、Any超类、object关键字详解
Kotlin中继承、类型转换、Any超类、object关键字详解
85 0
理论+实践:从原型链到继承模式,掌握 Object 的精髓(二)(下)
理论+实践:从原型链到继承模式,掌握 Object 的精髓(二)(下)
|
9月前
|
存储 JavaScript 前端开发
理论+实践:从原型链到继承模式,掌握 Object 的精髓(二)(上)
理论+实践:从原型链到继承模式,掌握 Object 的精髓(二)
|
9月前
|
存储 JavaScript 前端开发
理论+实践:从原型链到继承模式,掌握 Object 的精髓(一)
理论+实践:从原型链到继承模式,掌握 Object 的精髓(一)
|
9月前
|
安全 Java 编译器
Java中的String实例化、Annotation注解类、继承的多态和Object类(附带相关面试题)
1.java中String两种实例化对象2.Annotation注解类 3.继承的多态 4.Object类
85 0
Java中的String实例化、Annotation注解类、继承的多态和Object类(附带相关面试题)
|
Java
Java中[I@4554617c问题:数组继承object类的toString方法
Java中[I@4554617c问题:数组继承object类的toString方法
124 0
|
Java C语言
Java继承——Object
Java继承——Object
142 0
|
存储 Java 编译器
【重学Java四】Object通用方法、继承
在Java8之前,如果一个接口想要添加新的方法,那么要修改所有实现了该接口的类,让它们都实现新增的方法。HashSet和HashMap等集合类使用了hashCode()方法来计算对象应该存储的位置,因此要将对象添加到这些集合类中,需要让对应的类实现hashCode()方法。clone()是Object的protected方法,它不是public,一个类不显式去重写clone(),其它类就不能直接去调用该类实例的clone()方法。
129 0
【重学Java四】Object通用方法、继承
#掌握如何创建类和对象,以及属性和函数的分类 #object是所有类最终都会继承的类,如果没有合适的继承类就使用他
#掌握如何创建类和对象,以及属性和函数的分类 #object是所有类最终都会继承的类,如果没有合适的继承类就使用他
|
Java Android开发 C++
再谈 Java 的继承和超类 Object(2)
再谈 Java 的继承和超类 Object
96 0