Possible en double:
Why isn’t there generic variance for classes in C# 4.0?Pourquoi les classes de .NET 4 ne sont-elles pas covariantes?
En tant que programmeur novice j'ai quelques questions au sujet de la variance dans .NET 4. Pas tellement sur la façon dont cela fonctionne, mais pourquoi certaines choses sont pas variante et si d'autres personnes trouveraient cela utile.
Question 1:
Je sais que les interfaces et les délégués peuvent être covariante/contravariant dans .NET 4, mais pourquoi pas les classes? Donc, question 1:
List(of BaseClass) = List(of DerivedClass)
Est-ce que c'est quelque peu dangereux? Cela ne serait-il pas utile?
Question 2:
Question 2 découle de la question 1, mais peut traiter plus de signatures que la variance. Supposons que j'ai une classe MustInherit avec un membre MustOverride:
Public MustInherit Class TestBase
Public MustOverride Property SomeClass as BaseClass
End Class
Dans la classe dérivée, pourquoi je ne peux pas passer outre SomeClass et retourner une classe dérivée de BaseClass? Est-ce dangereux? Est-ce juste que les signatures ne vérifient pas les relations d'héritage?
Public Class TestSpecific
Inherits TestBase
Public Overrides Property SomeClass as DerivedClass
End Class
Tout renseignement sur les raisons pour lesquelles cela n'est pas autorisé dans .NET 4 serait apprécié.
Pour répondre à votre deuxième question (puisque la question était fermée pendant que je répondais): Vous pouvez le faire en ajoutant un peu de génériques à la classe de base. Java Enums l'utilise, par exemple, pour s'assurer que 'compareTo' ne peut être que des valeurs passées de cette énumération. Voir [ici] (http://madbean.com/2004/mb2004-3/) et [ici] (http://msmvps.com/blogs/jon_skeet/archive/2008/08/20/lessons-learned-from -protocole-tampons-partie-2-autoréférentielle-générique-types.aspx). –