有人可以幫助我們瞭解下面的代碼是否相同。如果不是類和interfance實例之間有什麼區別。接口實例與類實例化
IUnityContainer container = new UnityContainer()
UnityContainer container = new UnityContainer()
據我所知,Inteface只有方法簽名,如果接口已被3類實現。不太確定上述第一條語句將創建哪個實例。
謝謝。
有人可以幫助我們瞭解下面的代碼是否相同。如果不是類和interfance實例之間有什麼區別。接口實例與類實例化
IUnityContainer container = new UnityContainer()
UnityContainer container = new UnityContainer()
據我所知,Inteface只有方法簽名,如果接口已被3類實現。不太確定上述第一條語句將創建哪個實例。
謝謝。
接口不能按定義實例化。你總是實例化一個具體的類。
所以在這兩個陳述你的實例實際上是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
實例爲好。這是接口的力量;你可以給他們任何實現它的類。
真的沒有「接口實例化」這樣的東西,但有接口變量。第一行是一個這樣的變量的例子。
在第一行中,您可以將container
實例化爲實現IUnityContainer
的任何具體類。在第二行中,container
對象只能從UnityContainer
類或派生類實例化。
當您在代碼中使用接口變量時,它允許您更輕鬆地切換出具體的實現,從而使您的代碼更加靈活。
這不是真的。 'UnityContainer'實現'IUnityContainer',所以你可以將第二個變量傳遞給接受'IUnityContainer'的方法。 – dlev
第二個版本當然可以使用以'IUnityContainer'作爲參數的方法。如果一個類實現了一些接口,它可以隱式轉換爲該接口。 – svick
你說得對。我誤解了這一點。不知道我在想什麼...... – FishBasketGordo
編譯器認爲實例化並存儲在IUnityContainer container
變量中的對象只有在IUnityContainer
接口中定義的成員。也就是說,如果UnityContainer
類包含未由IUnityContainer
接口定義的成員,則將無法調用它們。另一方面,您可以將任何實現IUnityContainer
接口的對象「放入」IUnityContainer container
變量中 - 而不僅僅是UnityContainer
的實例。在第二個聲明中,您堅持使用UnityContainer
的實例以及繼承層次結構中的對象。
查看C# Programming Guide to Interfaces瞭解更多關於接口的信息及其使用方法。
當你說「屬性」時,你可能是指「成員」。 – svick
已更新。謝謝,@svick! –
接口實例化是不可能的。但是當我們使用它的實現類創建一個接口對象時,它就可以工作。
IUnityContainer container = new UnityContainer()// It is assigning an object of its implemented class.
UnityContainer container = new UnityContainer() // To access directly by using like this.
假設有一個多重繼承,爲了實現這一點,我們首先需要去。
有沒有必要提供這樣的事情,我們以第二種方式去。
接口限制直接訪問數據及其類的成員。
當你可以實例化一個接口時,有一個例外情況:它是一個COM接口。 – svick
不錯!我確信你的話「丟失信息」不打算使用接口降級。 –
@Gert試圖讓它容易理解......結果更令人費解,我希望。 – NullUserException