Cela ressemble à ce que vous voulez, c'est le type de retour de la covariance. C# ne prend pas en charge le type de retour de la covariance.
Le type de retour de la covariance est l'endroit où vous substituez une méthode de classe de base qui renvoie moins à un type spécifique avec l'un qui renvoie un plus spécifique:
abstract class Enclosure
{
public abstract Animal Contents();
}
class Aquarium : Enclosure
{
public override Fish Contents() { ... }
}
C'est sûr, parce que les consommateurs de Contenu via le Boîtier s'attendre à un Animal, et l'Aquarium promet non seulement de satisfaire à cette condition, mais en outre de rendre plus stricte promesse: que l'animal est toujours un poisson.
Ce genre de covariance n'est pas pris en charge en C#, et il est peu probable d'être toujours pris en charge. Il n'est pas pris en charge par le CLR. (Il est pris en charge par le C++ et le C++/CLI mise en œuvre sur le CLR; il le fait en générant magique méthodes d'assistance de la sorte, je suggère ci-dessous.)
(Certains d'appui aux langues paramètre formel de type contravariance ainsi, que vous pouvez remplacer une méthode qui prend un Poisson avec une méthode qui prend un Animal. Encore une fois, le contrat est rempli; la classe de base exige que tous les Poissons doivent être manipulés, et la classe dérivée promet non seulement de manipuler les poissons, mais n'importe quel animal. De même, le C# et le CLR ne prennent pas en charge le paramètre formel de type contravariance.)
La façon dont vous pouvez contourner cette limitation est de faire quelque chose comme:
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() { ... }
}
Maintenant, vous obtenez à la fois les avantages du remplacement d'une méthode virtuelle, de plus en plus à taper lors de l'utilisation de quelque chose de la compilation type d'Aquarium.