Чем ковариация холоднее полиморфизма… и не избыточна?

.NET 4 вводит ковариацию. Думаю, это полезно. В конце концов, MS прошла через все трудности, добавляя его в язык C #. Но почему ковариация более полезна, чем старый добрый полиморфизм?

Я написал этот пример, чтобы понять, почему мне следует реализовать Ковариацию, но я все еще не понимаю. Пожалуйста, просветите меня.

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();
        }
    }
}
9
задан P.Brian.Mackey 4 January 2011 в 20:07
поделиться