這其實是個很基礎的問題,在我們學習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創世之祖的戒律。