這個問題是相當混亂。讓我看看我能否澄清它。
當我嘗試實施IGreatInterface
編譯器標誌的錯誤aMethodBeta()
,因爲我做了使用亞型的IAnInterface
我想實現像這樣的方法,該方法:Object aMethodBeta(AnInterestingClass parameter)
。
這不合法。有些簡化:
class Food {}
class Fruit : Food {}
class Meat : Food {}
interface IEater
{
void Eat(Food food);
}
class Vegetarian : IEater
{
public void Eat(Fruit fruit);
}
類Vegetarian
不履行的IEater
合同。您應該可以通過任何食物吃,但Vegetarian
只接受水果。 C#不支持虛擬方法形式參數協方差,因爲它不是類型安全的。
現在,你可能會然後說,這個怎麼樣:
interface IFruitEater
{
void Eat(Fruit fruit);
}
class Omnivore : IFruitEater
{
public void Eat(Food food);
}
現在我們已經得到了類型安全; Omnivore
可用作IFruitEater
,因爲Omnivore
可以吃水果以及任何其他食物。
不幸的是,C#不支持虛擬方法形式參數類型衝突即使這樣做理論上是類型安全的。很少有語言支持這一點。
同樣,C#不支持虛擬方法返回類型方差要麼。
我不確定這是否真的回答了您的問題。你能澄清這個問題嗎?
UPDATE:
關於什麼:
interface IEater
{
void Eat<T>(T t) where T : Food;
}
class Vegetarian : IEater
{
// I only want to eat fruit!
public void Eat<Fruit>(Fruit food) { }
}
不,這不是法律無論是。 IEater
的合同是你會提供一種方法Eat<T>
,可以採取任何T
是Food
。你不能部分實行承包,比你能做到這一點任何更多:
interface IAdder
{
int Add(int x, int y);
}
class Adder : IAdder
{
// I only know how to add two!
public int Add(2, int y){ ... }
}
但是,你可以這樣做:
interface IEater<T> where T : Food
{
void Eat(T t);
}
class Vegetarian : IEater<Fruit>
{
public void Eat(Fruit fruit) { }
}
這是完全合法的。但是,您不能這樣做:
interface IEater<T> where T : Food
{
void Eat(T t);
}
class Omnivore : IEater<Fruit>
{
public void Eat(Food food) { }
}
因爲C#不再支持虛擬方法形式參數逆變或協方差。
注意,C#確實支持參數多態性協方差這樣做時被稱爲是類型安全。例如,這是合法的:
IEnumerable<Fruit> fruit = whatever;
IEnumerable<Food> food = fruit;
水果序列可以用作一系列食物。或者,
IEnumerable<Fruit> fruitComparer = whatever;
IComparable<Apples> appleComparer = fruitComparer;
如果你有什麼東西可以比較任何兩個水果,那麼它可以比較任意兩個蘋果。 (1)方差可證明是類型安全的;(2)類型的作者增加了方差註釋,表示期望的合作和對照;(2) (3)涉及的變量類型參數都是引用類型,(4)泛型類型是委託或接口。
我不太明白你的問題。你能發佈實現IGreatInterface的代碼和特定的編譯器錯誤嗎? – phoog
@Juan:作爲一個方面說明它有助於用*更新*標記您的更新或什麼,所以我們看到了什麼改變。 –