.NET 4 introduit la covariance. Je suppose que c'est utile. Après tout, les États membres ont traversé toutes les difficultés de l'ajouter à la langue C #. Mais pourquoi la covariance est-elle plus utile que le bon vieux polymorphisme?
J'ai écrit cet exemple pour comprendre pourquoi je devrais mettre en œuvre la covariance, mais je ne l'obtiens toujours pas. S'il vous plaît éclairer moi. P>
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Sample { class Demo { public delegate void ContraAction<in T>(T a); public interface IContainer<out T> { T GetItem(); void Do(ContraAction<T> action); } public class Container<T> : IContainer<T> { private T item; public Container(T item) { this.item = item; } public T GetItem() { return item; } public void Do(ContraAction<T> action) { action(item); } } public class Shape { public void Draw() { Console.WriteLine("Shape Drawn"); } } public class Circle:Shape { public void DrawCircle() { Console.WriteLine("Circle Drawn"); } } public static void Main() { Circle circle = new Circle(); IContainer<Shape> container = new Container<Circle>(circle); container.Do(s => s.Draw());//calls shape //Old school polymorphism...how is this not the same thing? Shape shape = new Circle(); shape.Draw(); } } }
3 Réponses :
considérer une API qui demande un Vous avez un Ce n'est pas un problème rare dans les API qui utilisent beaucoup de paramètres génériques. p> p> iContainer
conteneur
Drawshape Code> API? Sans covariance, le type
conteneur
iConTenerer
C'est la version générique de:
arr[0] = new object(); //Run-time error
En fait, le but d'ajouter de la contrevenance était de empêcher i> les types de bugs que vous parlez de.
La covariance est plus fraîche que le polymorphisme de la même manière que les Jackrabbits sont plus frais que les Icesquates: ils ne sont pas la même chose.
Covariance et Contravarariance (et invariance et ... omnivariance ... personne?) Traiter le "Direction" que les génériques peuvent aller en ce qui concerne l'héritage. Dans votre exemple, vous faites la même chose, mais ce n'est pas un exemple significatif. P>
considère, par exemple, le fait que dans les versions précédentes de C #, cela aurait été impossible, comme Ce type de chose pourrait être fonctionné dans les versions précédentes sous certains em> circonstances En faisant la fonction elle-même générique et en utilisant une inférence de type générique, produisant une syntaxe identique dans de nombreux cas. Cela n'a toutefois pas résolu le problème plus large et n'était en aucun cas une solution de contournement à 100%. P> p> ienumerable
T code>. Cela nous permet de faire quelque chose comme ceci: p>
list
IEnumerable code> et
iEnumerable
iEnumerable
ienumerable
out t code>, nous savons qu'il est maintenant compatible pour l'affectation ou le paramètre qui passe pour tout
ienumerable
t est y code> ou
t: y code>. p>
Vous devriez lire ceci: Stackoverflow.com/Questtions/1078423/...
On dirait que tu postes vraiment à propos de la covariance, pas de contrevenance?
D'accord, Dan. Je suis tenté de modifier la question, mais je vais le laisser pour Brian de clarifier.
@Dan Yea, je me suis retourné entre les deux et je me suis perdu. Merci de le pointer.