2012-04-24 51 views
1

我知道一個接口是一種抽象類型,它不包含任何數據,但暴露了行爲和屬性,並且對象的實例是存在於內存中的對象的出現或副本。從編譯器/ CLR的角度來看,Interface和具體實例之間有什麼區別?

我想知道編譯器/底層代碼如何處理這兩個差異?基於對此的回答,如果我將接口作爲依賴項傳遞給對象而不是具體實例,爲什麼代碼更鬆散地耦合?如果我將在接口中定義的DoSomething方法調用爲MyClass而不是在MyClass的具體實例中定義的DoSomething方法,會發生什麼情況?

+0

我認爲你的問題在這裏很好地回答:http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_interrfaces03052006095933AM/csharp_interrfaces.aspx – 2012-04-24 10:40:40

+2

@MichalB .:我不太確定。這只是解釋接口以及如何使用/如何使用它們。它沒有提到CLR /編譯器。 – 2012-04-24 10:48:48

+0

對於某些背景知識,請參閱此問題的頂級答案:[CLR實現對接口成員的虛擬方法調用](http://stackoverflow.com/q/9808982)。 (第二個鏈接谷歌搜索'接口實現CLR') – 2012-04-24 10:50:39

回答

1

我知道你說過你明白接口是什麼 - 但我想知道這是否完全正確,因爲你已經將第二個問題與第一個問題聯繫起來了。第二種可以在沒有任何第一種知識的情況下得到回答,也不會以任何方式受到影響。

專門就爲什麼它更加鬆散耦合無關的編譯器或任何執行的問題:它只是軟件架構

接口不對實現類型施加任何限制,除了方法/屬性的存在(好吧,從技術上說它們也是方法)。

該實現甚至不需要在類型本身上公開,類型也不必具有某個構造方法等。更重要的是 - 它甚至不必是類的。然後有一個(相當邊緣)的事情,對於接口,一個類型可以有多個相同接口的實現。

只要您使用基類,可能會引入其他限制的整個負載。

確實,這些顯然也是一件好事 - 例如,如果一個已知的具體基地已知是不可變的(爲了一致性),並且不允許在它的構造函數中存在「nulls」(所有這些都不能通過接口)。

0

您可以有許多接口或抽象類的實現(具體實例)。

一般來說,你應該定義接受具有接口而不是具體類的類層次結構的方法,這樣它們將是通用的,並且不必爲每個你定義的新實現重寫。

在基類或派生類中調用該方法應該調用相同的方法,假設您正確地覆蓋該方法。

+5

問題是CLR如何處理差異,而不是差異。 – Oded 2012-04-24 10:42:37

相關問題