2011-08-26 201 views
15

有人可以幫助我們瞭解下面的代碼是否相同。如果不是類和interfance實例之間有什麼區別。接口實例與類實例化

IUnityContainer container = new UnityContainer() 
UnityContainer container = new UnityContainer() 

據我所知,Inteface只有方法簽名,如果接口已被3類實現。不太確定上述第一條語句將創建哪個實例。

謝謝。

回答

44

接口不能按定義實例化。你總是實例化一個具體的類。

所以在這兩個陳述你的實例實際上是UnityContainer類型。

不同之處在於第一條語句,就C#而言,您的container實現了IUnityContainer,它可能有一個不同於UnityContainer的API。


考慮:

interface IAnimal 
{ 
    void die(); 
} 

class Cat : IAnimal 
{ 
    void die() { ... } 
    void meow() { ... } 
} 

現在:

IAnimal anAnimal = new Cat(); 
Cat aCat= new Cat(); 

C#糊塗賬anAnimal.die()作品,因爲die()IAnimal定義。但它不會讓你做anAnimal.meow(),即使它是Cat,而aCat可以調用這兩種方法。

當您使用界面作爲您的類型時,您在某種程度上會丟失信息。

但是,如果你有其他類Dog也實現IAnimal,你anAnimal可以引用Dog實例爲好。這是接口的力量;你可以給他們任何實現它的類。

+4

當你可以實例化一個接口時,有一個例外情況:它是一個COM接口。 – svick

+0

不錯!我確信你的話「丟失信息」不打算使用接口降級。 –

+0

@Gert試圖讓它容易理解......結果更令人費解,我希望。 – NullUserException

3

真的沒有「接口實例化」這樣的東西,但有接口變量。第一行是一個這樣的變量的例子。

在第一行中,您可以將container實例化爲實現IUnityContainer的任何具體類。在第二行中,container對象只能從UnityContainer類或派生類實例化。

當您在代碼中使用接口變量時,它允許您更輕鬆地切換出具體的實現,從而使您的代碼更加靈活。

+0

這不是真的。 'UnityContainer'實現'IUnityContainer',所以你可以將第二個變量傳遞給接受'IUnityContainer'的方法。 – dlev

+1

第二個版本當然可以使用以'IUnityContainer'作爲參數的方法。如果一個類實現了一些接口,它可以隱式轉換爲該接口。 – svick

+0

你說得對。我誤解了這一點。不知道我在想什麼...... – FishBasketGordo

0

編譯器認爲實例化並存儲在IUnityContainer container變量中的對象只有在IUnityContainer接口中定義的成員。也就是說,如果UnityContainer類包含未由IUnityContainer接口定義的成員,則將無法調用它們。另一方面,您可以將任何實現IUnityContainer接口的對象「放入」IUnityContainer container變量中 - 而不僅僅是UnityContainer的實例。在第二個聲明中,您堅持使用UnityContainer的實例以及繼承層次結構中的對象。

查看C# Programming Guide to Interfaces瞭解更多關於接口的信息及其使用方法。

+0

當你說「屬性」時,你可能是指「成員」。 – svick

+0

已更新。謝謝,@svick! –

0

接口實例化是不可能的。但是當我們使用它的實現類創建一個接口對象時,它就可以工作。

IUnityContainer container = new UnityContainer()// It is assigning an object of its implemented class. 
UnityContainer container = new UnityContainer() // To access directly by using like this. 

假設有一個多重繼承,爲了實現這一點,我們首先需要去。

有沒有必要提供這樣的事情,我們以第二種方式去。

接口限制直接訪問數據及其類的成員。