Interface继承至System.Object?
2012-05-23 09:27
253 查看
这其实是个很基础的问题,在我们学习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:
而interface Itest的IL:
从上面两个IL比较我们可以清晰的看出来class有显示的extends [mscorlib]System.Object,而接口没有,本篇的答案到这里你应该很清晰吧。这里还需要说明的是他们都是class,说明都是一种类型,而interface是一种特殊的类型。
接口能定义什么?接口能定义行为(方法),无参属性(属性,又称守信),有参属性(索引),不能定义私例字段,定义都是对编译器都是一组方法行为。
在最后我们在来说说前面说的“所有的对象都继承至System.Object”,这是真的嘛?在c#的编译过程中为我们提供了一个选项NOAUTOINHERIT,是的我们可以为自定义类型去掉默认的System.Object的基类。这就打破了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:
而interface Itest的IL:
从上面两个IL比较我们可以清晰的看出来class有显示的extends [mscorlib]System.Object,而接口没有,本篇的答案到这里你应该很清晰吧。这里还需要说明的是他们都是class,说明都是一种类型,而interface是一种特殊的类型。
接口能定义什么?接口能定义行为(方法),无参属性(属性,又称守信),有参属性(索引),不能定义私例字段,定义都是对编译器都是一组方法行为。
在最后我们在来说说前面说的“所有的对象都继承至System.Object”,这是真的嘛?在c#的编译过程中为我们提供了一个选项NOAUTOINHERIT,是的我们可以为自定义类型去掉默认的System.Object的基类。这就打破了System.Object创世之祖的戒律。
相关文章推荐
- Interface继承至System.Object? 推荐
- Interface继承至System.Object?
- 是否存在不继承自System.Object类型的类
- 接口继承自System.Object吗?
- 不从 System.Object 继承之后
- 接口类型是否继承于System.Object的讨论?
- 不从 System.Object 继承之后
- [你必须知道的.NET]第二十七回:interface到底继承于object吗?
- Java中的接口Interface是不是继承自Object?+ 复习基本概念
- 关于interface继承来源的讨论-interface不从object继承
- Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Interop.E
- [你必须知道的.NET]第二十七回:interface到底继承于object吗?
- 使用FileSystemObject操纵本地文件、目录
- POSIX——Portable Operating System Interface of UNIX
- 分享一个图:Linux kernel System Call Interface and glibc
- 1.每颗类继承树一张表:Object,hbm
- System.Object
- 理清javascript中prototype、__proto__、Object、Function的关系,更好地理解原型继承
- Static Nested Class 和 Inner Class的不同。Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
- web基础类(继承System.Web.UI.Page)的问题解决方案~