ОБНОВЛЕНИЕ: этот ответ был написан в 2011 году. После двух десятилетий того, как люди предлагали ковариантность возвращаемого типа для C #, похоже, что он, наконец, будет реализован; Я очень удивлен. См. Объявление внизу https://devblogs.microsoft.com/dotnet/welcome-to-c-9-0/ ; Я уверен, что подробности будут позже.
Похоже, вам нужна ковариация возвращаемого типа. C # не поддерживает ковариацию возвращаемого типа.
Ковариация возвращаемого типа - это когда вы переопределяете метод базового класса, который возвращает менее конкретный тип, на метод, который возвращает более конкретный тип:
abstract class Enclosure
{
public abstract Animal Contents();
}
class Aquarium : Enclosure
{
public override Fish Contents() { ... }
}
Это безопасно, потому что потребители Контента через вольер ожидают животного, и Аквариум обещает не только выполнить это требование, но, более того, дать более строгое обещание: животное всегда будет рыбой.
Этот вид ковариации не поддерживается в C # и вряд ли когда-либо будет поддерживаться. Он не поддерживается средой CLR. (Он поддерживается C ++ и реализацией C ++ / CLI в CLR; он делает это путем создания волшебных вспомогательных методов того типа, который я предлагаю ниже.)
(Некоторые языки также поддерживают контравариантность формальных параметров - вы можете переопределить метод, принимающий Fish, методом, принимающим Animal. И снова контракт выполняется; базовый класс требует, чтобы любая Fish обрабатывалась, а производный обещает обрабатывать не только рыбу, но и любое животное. Точно так же C # и CLR не поддерживают контравариантность формальных типов параметров.)
Чтобы обойти это ограничение, выполните следующие действия:
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() { ... }
}
Теперь вы получаете как преимущества переопределения виртуального метода, так и усиление набора текста при использовании чего-то типа Aquarium во время компиляции.