• 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创世之祖的戒律。


    作者:破  狼 
    出处:http://www.cnblogs.com/whitewolf/ 
    本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-博客园--破狼51CTO--破狼

  • 相关阅读:
    struts2: 通过流输出实现exce导出
    Spring Security笔记:Remember Me(下次自动登录)
    Spring Security笔记:登录尝试次数限制
    Spring Security笔记:使用BCrypt算法加密存储登录密码
    Spring Security笔记:使用数据库进行用户认证(form login using database)
    Spring Security笔记:HTTP Basic 认证
    Spring Security笔记:自定义登录页
    Spring Security笔记:Hello World
    Spring官网下载dist.zip的几种方法
    UML:类图复习-鸡生蛋,蛋生鸡
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2514232.html
Copyright © 2020-2023  润新知