GÜNCELLEME: Bu cevap 2011'de yazılmıştır. Yirmi yıllık insan C # için dönüş tipi kovaryans önerdikten sonra, sonunda uygulanacak gibi görünüyor; Ben oldukça şaşırdım. Duyuru için https://devblogs.microsoft.com/dotnet/welcome-to-c-9-0/ alt kısmına bakın ; Eminim ayrıntılar takip edecek.
Geri dönüş tipi kovaryans istediğiniz gibi geliyor. C #, dönüş türü kovaryansı desteklemez.
Dönüş türü kovaryansı, daha az spesifik bir tür döndüren temel sınıf yöntemini, daha belirli bir tür döndüren bir yöntemle geçersiz kıldığınız yerdir:
abstract class Enclosure
{
public abstract Animal Contents();
}
class Aquarium : Enclosure
{
public override Fish Contents() { ... }
}
Bu güvenlidir, çünkü Muhafaza yoluyla İçerik tüketicileri bir Hayvan bekler ve Akvaryum yalnızca bu gereksinimi yerine getirmeyi değil, aynı zamanda daha katı bir söz vermeyi vaat eder: hayvan her zaman bir balıktır.
Bu tür bir kovaryans C # 'da desteklenmez ve muhtemelen desteklenmez. CLR tarafından desteklenmez. (C ++ ve CLR üzerinde C ++ / CLI uygulaması tarafından desteklenir; bunu aşağıda önerdiğim türden sihirli yardımcı yöntemler üreterek yapar.)
(Bazı diller, bir Hayvan alan bir yöntemle bir Balık alan bir yöntemi geçersiz kılabileceğiniz biçimsel parametre türü kontraveriansını da destekler. Yine, sözleşme yerine getirilir; temel sınıf, herhangi bir Balığın ele alınmasını ve türetilmesini gerektirir. sınıf sadece balıkları değil, herhangi bir hayvanı da idare etmeyi vaat ediyor. Benzer şekilde, C # ve CLR, resmi parametre türü kontrolünü desteklemez.)
Bu sınırlamayı aşmanın yolu şuna benzer bir şey yapmaktır:
abstract class Enclosure
{
protected abstract Animal GetContents();
public Animal Contents() { return this.GetContents(); }
}
class Aquarium : Enclosure
{
protected override Animal GetContents() { return this.Contents(); }
public new Fish Contents() { ... }
}
Artık hem sanal bir yöntemi geçersiz kılmanın hem de derleme zamanı türü Aquarium'u kullanırken daha güçlü yazmanın avantajlarını elde edersiniz.