J'ai un problème à comprendre comment le polymorphisme fonctionne lors de l'utilisation de génériques. À titre d'exemple, j'ai défini le programme suivant:
MyClass newClass = new MyClass(); IMyInterface myInterface = (IMyInterface)newClass;
3 Réponses :
Remarque: Dans tous les cas, vous devrez initialiser le champ code> code> sur un objet concret implémentant lorsque vous gardez la contrainte générique , vous pouvez faire: p> Lorsque vous ne le faites pas, vous pouvez faire: p> ilist > code>
MyContainer container = new MyContainer();
container.Contents.Add(new MyClass());
this.CallAllMethodsInContainer(container);
C'est un problème de covariance p>
http://msdn.microsoft.com/en-us/library /dd799517.aspx p>
Vous ne pouvez pas lancer myContainer
myContainer
Sommaire.Ajouter (nouveau autreClassThatimplemplementsImyInterface ()) code> p>
WOW, cette question a été lancée beaucoup récemment.
Réponse courte: Non, ce n'est pas possible. Voici ce que fort> est fort> possible: p> et voici pourquoi ce que vous avez essayé n'est pas fort> possible (pris de Considérez la liste Le code ci-dessus illustre ce que signifie être (et ne pas être) a Type Covariant Strong> . Notez que la diffusion d'un type pense de cette façon: si un type Incidemment, un type est Contravariant em> si son paramètre de type générique apparaît uniquement sous la forme d'entrée - c'est-à-dire des paramètres de la méthode. Si un type pense de cette façon: Si un type Votre
list
list
list
t
t code> où
d code> dérive de
b code> est possible (en .NET 4.0) si
t code> est covariant em>; Un type générique est covariant si son argument de type générique n'apparaît jamais sous la forme de la sortie - c'est-à-dire des propriétés en lecture seule et des valeurs de retour de fonction. P>
T code> toujours fournit un
B code> em>, puis une qui fournit toujours un
d code> (
t
t code> car tous les
d code> s sont
b code> s. p>
t code> est contravariant alors il peut être coulé à un
t
t code> Toujours nécessite un
B code> em>, alors il peut entrer pour une personne qui nécessite toujours un < code> d code> car, à nouveau, tous
d code> s sont
b code> s. p>
myContainer code> classe est Ni covariant ni contrevraveurt, car son paramètre de type apparaît dans les deux contextes - comme entrée (via
contenu.add code>) et comme sortie (via le contenu
p > p>
C'est là que les gens trotent des mots effrayants comme la covariance et la contrevenance.
@Greg: sur le côté de plus, je me sens comme mon posséder i> la compréhension de ces concepts a vraiment été enveloppée récemment en raison de la pléthore de questions telles que celles-ci.
Les concepts sont bons, mais les noms sont effrayants. :)
@Greg: convenu. Je propose que nous les changeons à Gobbling and Spewing .