.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();
}
}
}
考虑一个 API,它要求IContainer<Shape>
:
public void DrawShape(IContainer<Shape> container>) { /* ... */ }
你有一个Container<Circle>
。您如何将您的容器传递给DrawShape
API?如果没有协方差,则类型Container<Circle>
不可转换为IContainer<Shape>
,要求您重新包装类型或想出一些其他解决方法。
在使用大量通用参数的 API 中,这并不是一个罕见的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)