我知道一個接口是一種抽象類型,它不包含任何數據,但暴露了行爲和屬性,並且對象的實例是存在於內存中的對象的出現或副本。從編譯器/ CLR的角度來看,Interface和具體實例之間有什麼區別?
我想知道編譯器/底層代碼如何處理這兩個差異?基於對此的回答,如果我將接口作爲依賴項傳遞給對象而不是具體實例,爲什麼代碼更鬆散地耦合?如果我將在接口中定義的DoSomething
方法調用爲MyClass
而不是在MyClass
的具體實例中定義的DoSomething
方法,會發生什麼情況?
我知道一個接口是一種抽象類型,它不包含任何數據,但暴露了行爲和屬性,並且對象的實例是存在於內存中的對象的出現或副本。從編譯器/ CLR的角度來看,Interface和具體實例之間有什麼區別?
我想知道編譯器/底層代碼如何處理這兩個差異?基於對此的回答,如果我將接口作爲依賴項傳遞給對象而不是具體實例,爲什麼代碼更鬆散地耦合?如果我將在接口中定義的DoSomething
方法調用爲MyClass
而不是在MyClass
的具體實例中定義的DoSomething
方法,會發生什麼情況?
我知道你說過你明白接口是什麼 - 但我想知道這是否完全正確,因爲你已經將第二個問題與第一個問題聯繫起來了。第二種可以在沒有任何第一種知識的情況下得到回答,也不會以任何方式受到影響。
專門就爲什麼它更加鬆散耦合無關的編譯器或任何執行的問題:它只是軟件架構。
接口不對實現類型施加任何限制,除了方法/屬性的存在(好吧,從技術上說它們也是方法)。
該實現甚至不需要在類型本身上公開,類型也不必具有某個構造方法等。更重要的是 - 它甚至不必是類的。然後有一個(相當邊緣)的事情,對於接口,一個類型可以有多個相同接口的實現。
只要您使用基類,可能會引入其他限制的整個負載。
確實,這些顯然也是一件好事 - 例如,如果一個已知的具體基地已知是不可變的(爲了一致性),並且不允許在它的構造函數中存在「nulls」(所有這些都不能通過接口)。
您可以有許多接口或抽象類的實現(具體實例)。
一般來說,你應該定義接受具有接口而不是具體類的類層次結構的方法,這樣它們將是通用的,並且不必爲每個你定義的新實現重寫。
在基類或派生類中調用該方法應該調用相同的方法,假設您正確地覆蓋該方法。
問題是CLR如何處理差異,而不是差異。 – Oded 2012-04-24 10:42:37
查看MSDN雜誌文章:"Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects"瞭解實施細節。
我認爲運行時需要支持接口的主要原因尤其與運行時編譯時間不同的程序集可能相互連接的事實有關。
我認爲你的問題在這裏很好地回答:http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_interrfaces03052006095933AM/csharp_interrfaces.aspx – 2012-04-24 10:40:40
@MichalB .:我不太確定。這只是解釋接口以及如何使用/如何使用它們。它沒有提到CLR /編譯器。 – 2012-04-24 10:48:48
對於某些背景知識,請參閱此問題的頂級答案:[CLR實現對接口成員的虛擬方法調用](http://stackoverflow.com/q/9808982)。 (第二個鏈接谷歌搜索'接口實現CLR') – 2012-04-24 10:50:39