9
votes

Comment la covérité est-elle plus fraîche que le polymorphisme ... et non redondante?

.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();
        }
    }
}


4 commentaires

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.


3 Réponses :


10
votes

considérer une API qui demande un iContainer : xxx

Vous avez un conteneur . Comment pouvez-vous transmettre votre conteneur dans le Drawshape API? Sans covariance, le type conteneur n'est pas convertible vers iConTenerer , vous obligeant à réarranger le type ou à proposer une autre solution de contournement.

Ce n'est pas un problème rare dans les API qui utilisent beaucoup de paramètres génériques.


0 commentaires

-1
votes

C'est la version générique de:

arr[0] = new object(); //Run-time error


1 commentaires

En fait, le but d'ajouter de la contrevenance était de empêcher les types de bugs que vous parlez de.



5
votes

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.

considère, par exemple, le fait que ienumerable est T . Cela nous permet de faire quelque chose comme ceci: xxx

dans les versions précédentes de C #, cela aurait été impossible, comme list implémente IEnumerable et iEnumerable , pas iEnumerable . Cependant, étant donné que ienumerable est out t , nous savons qu'il est maintenant compatible pour l'affectation ou le paramètre qui passe pour tout ienumerable t est y ou t: y .

Ce type de chose pourrait être fonctionné dans les versions précédentes sous certains 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%.


0 commentaires