我有一些繼承問題,因爲我有一組相互關聯的抽象類,需要全部重寫以創建客戶端實現。理想情況下,我想這樣做如下:爲什麼不繼承我認爲它應該工作的方式工作?
abstract class Animal
{
public Leg GetLeg() {...}
}
abstract class Leg { }
class Dog : Animal
{
public override DogLeg Leg() {...}
}
class DogLeg : Leg { }
這將使用Dog類任何人都可以自動獲得狗腿和使用動物類來獲得腿的人允許。問題是重寫的函數必須與基類具有相同的類型,所以不能編譯。我不明白爲什麼它不應該,因爲DogLeg可以隱式地轉化爲Leg。我知道有很多方法可以解決這個問題,但我更加好奇爲什麼在C#中這是不可能的/實現的。
編輯:我修改了這個有點,因爲我實際上在我的代碼中使用屬性而不是函數。
編輯:我改回了功能,因爲答案只適用於這種情況(協方差屬性上的設定功能不應該工作參數的值)。對不起,波動!我意識到這使得很多答案似乎無關緊要。
你的差異聲明沒有意義。 在子類型:協方差=相關類型被子類型& Contravariance =相關類型獲得超類型。 當C#只允許一個不變的(相同的)返回類型時,這個問題表示一個協變(在子類型中使用的子類型)返回類型。 – 2008-09-07 16:58:20
您鏈接到的那些文章是關於泛型類型差異。問題是關於返回類型協方差。我在那些文章中明確指出我不*在談論返回類型協方差。 – 2010-07-17 06:36:10