這有助於理解爲什麼這是非法的。你想要的功能是形式參數類型協方差,很少有語言提供它。 (艾菲爾,我認爲這是一個功能。)它在語言中不常見,因爲它不安全!讓我用一個例子來說明:
class Animal {}
class Lion : Animal { public void Roar() { } }
class Giraffe : Animal { }
interface IFoo { void M(Animal a); }
class C : IFoo
{
public void M(Lion lion) { lion.Roar(); }
}
class P
{
public static void Main()
{
IFoo foo = new C();
foo.M(new Giraffe());
}
}
而我們只是做了長頸鹿的咆哮。
如果你看看所有這些類型的轉換,唯一可以明顯違法的是匹配C.M(Giraffe)
到IFoo.M(Animal)
。
現在,正式參數類型逆變是類型安全但它不是在C#中的法律除了在某些非常有限的情況下。如果C#支持它,它沒有,那麼你可以放心地做這樣的事情:
interface IBar { void M(Giraffe g); }
class D : IBar
{
public void M(Animal animal) { ... }
}
class P
{
public static void Main()
{
IBar bar = new D();
bar.M(new Giraffe());
}
}
看看發生了什麼呢? IFoo.M說:「我可以帶長頸鹿」,C.M說:「我可以接受任何長頸鹿,因爲實際上我可以接受任何動物」。如果C#支持它,那將是類型安全的,但它僅以兩種方式支持它:
- 反變換泛型委託和接口轉換。
- 將方法組轉換爲委託類型的方法組轉換。
第一的一個例子是,IComparable<Animal>
類型的表達式可以由相同的邏輯被分配給IComparable<Giraffe>
類型的變量:比較兩個動物在需要比較兩個長頸鹿的方法,可以使用這樣的方法。這是在C#4
所述第二的一個例子是加入:
delegate void MyFunction(Giraffe g);
...
D d = new D();
MyFunction myfunc = d.M;
再次,我們需要一個函數,一個長頸鹿,我們提供一個可以接收任意動物。此功能添加到C#2中。
您應該使接口本身具有通用性併爲實現類提供所需的類型。 – Rik 2013-04-11 13:19:00
如何在print方法中不使用參數並使每個子類將IClass實現注入到構造器或Sertter中。 – 2013-04-11 13:19:35
toString方法繼承自Object,所以爲什麼你真的需要'print(MyClass item)'而不是'print(Object item)'? 你隱藏這種方法嗎? – Thomas 2013-04-11 13:19:49