Звучит так, как будто вы хотите получить ковариацию типа возврата.C # не поддерживает ковариацию возвращаемого типа.
Ковариация возвращаемого типа - это то место, где вы переопределяете метод базового класса, который возвращает менее специфичный тип, а тот, который возвращает более конкретный тип:
abstract class Enclosure
{
public abstract Animal Contents();
}
class Aquarium : Enclosure
{
public override Fish Contents() { ... }
}
Это безопасно, потому что потребители Контента через Приложение ждут Животного, а Аквариум обещает не только выполнить это требование, но и дать более строгое обещание: животное всегда рыба.
Этот видковариация не поддерживается в C # и вряд ли когда-либо будет поддерживаться.Это не поддерживается CLR.(Он поддерживается C ++ и реализацией C ++ / CLI в CLR; он генерирует магические вспомогательные методы такого рода, который я предлагаю ниже.)
(Некоторые языки также поддерживают формальную контрастность типов параметров- что вы можете переопределить метод, который принимает Fish, методом, который принимает Animal. Опять же, контракт выполнен, базовый класс требует обработки любой рыбы, а производный класс обещает обрабатывать не только рыбу, но и любую другую.Аналогично, 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 во время компиляции.