ACTUALIZACIÓN: Esta respuesta se escribió en 2011. Después de dos décadas de personas que proponen la covarianza de tipo de retorno para C #, parece que finalmente se implementará; Estoy bastante sorprendido. Consulte la parte inferior de https://devblogs.microsoft.com/dotnet/welcome-to-c-9-0/ para ver el anuncio; Estoy seguro de que seguirán los detalles.
Parece que lo que desea es una covarianza de tipo de retorno. C # no admite la covarianza de tipo de retorno.
La covarianza del tipo de retorno es donde anula un método de clase base que devuelve un tipo menos específico con uno que devuelve un tipo más específico:
abstract class Enclosure
{
public abstract Animal Contents();
}
class Aquarium : Enclosure
{
public override Fish Contents() { ... }
}
Esto es seguro porque los consumidores de Contenidos vía Enclosure esperan un Animal, y Aquarium promete no solo cumplir con ese requisito, sino además, hacer una promesa más estricta: que el animal es siempre un pez.
Este tipo de covarianza no se admite en C # y es poco probable que lo sea alguna vez. No es compatible con CLR. (Es compatible con C ++ y con la implementación de C ++ / CLI en CLR; lo hace generando métodos de ayuda mágicos del tipo que sugiero a continuación).
(Algunos lenguajes también admiten contravarianza de tipo de parámetro formal, que puede anular un método que toma un pez con un método que toma un animal. Una vez más, el contrato se cumple; la clase base requiere que se manipule cualquier pez y el derivado class promete no solo manejar peces, sino cualquier animal. De manera similar, C # y CLR no admiten la contravarianza de tipo de parámetro formal.
La forma en que puede evitar esta limitación es hacer algo como:
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() { ... }
}
Ahora obtiene los beneficios de anular un método virtual y una escritura más fuerte cuando usa algo del tipo Acuario en tiempo de compilación.