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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM