第一個示例中的接口沒有被實例化,而是實例化的Cat()
實例的類型被聲明爲類型ICat
而不是Cat
。
在你的具體例子中,這不是很有趣。然而,考慮到了以下聲明的接口:一旦這個接口被應用到多個具體類型
public interface ICat
{
Meow();
Run();
Hunt();
}
,行爲可以在各種類應用,同時始終貫徹相同的行爲。
public class Lion : ICat
{
public void Roar();
public void Meow();
public void Run();
public void Hunt();
}
public class Tiger : ICat
{
public void Meow();
public void Run();
public void Hunt();
}
ICat lion = new Lion();
ICat tiger = new Tiger();
兩個具體事例可以受益於接口只有靠接口擔保,除非鑄造自己的具體類型的方法保證所有這三種方法。這提供了跨行爲的一致性。但是請注意,這不是實例化接口。它只是將具體實例分配給語言允許的共享接口類型。
結果:
lion.Run();
和tiger.Run()
都是完全允許的。
然而,
lion.Roar()
不會編譯,因爲它不是由接口保證。也就是說,如果轉換爲實際實例化並隨後分配給接口的基礎具體類型,則除了接口的方法外,還可以訪問該類型的方法。
((Lion)lion).Roar();
同樣:實例化時
Lion concreteLion = new Lion();
沒有分配到的接口。因此它可以直接訪問接口保證的所有三種方法,並且可以在不需要轉換的情況下調用concreteLion.Roar()
,因爲實例已直接分配給具體類型而不是由Lion類實現的接口。
如果兩行都實例化一類Cat。那麼我們如何直接或間接地實例化一個接口呢? –
你不能實例化接口。你只能實例化碰巧實現該接口的類。 – MarcinJuraszek
那麼這兩個聲明有什麼區別? '貓貓=新貓();'和'貓貓1 =新貓();'。你可以請進一步。 –