使用泛型可以定义接口,在接口中定义的方法可以带泛型参数。
Public interface A <T>
{
T method (T t);
}
1.协变和抗变
.NET4通过协变和抗变为泛型接口和泛型委托添加了一个重要的扩展。协变和抗变指对参数和返回值的类型进行转换。在.NET中,参数类型是协变的。假定有shape和rectangle两个雷,rectangle派生自shape基类。声明Display()方法是接受shape类型的对象作为参数的,现在可以传递派生自shape基类的任意对象,例如将rectangle的对象作为参数,编译器接受这个方法调用。
Public void Display(shape p) {}
Rectangle r = new Rectangle {w = 5,h = 2};
Display(r);
方法的返回类型是抗变的。当方法返回一个shape时,不能把它赋值给rectangle,因为是shape的一定是shape的反之不行。
2.泛型接口的协变
如果泛型类型用out关键字标注,泛型接口就是协变的。这也一位置返回类型只能是T。
Public interface IIndex<out T>
{
T this[int index] {get;}
int Count {get;};
}
3.泛型接口的抗变
如果泛型类型用in关键字标注,泛型接口就是抗变的。这样,接口只能把泛型类型T用作其方法的输入。
Public interface IDisplay<int T>
{
Void show (T item);
}
Public class ShapeDisplay:Display<shape>
{
Public void show(Shape s)
{
Console.WriteLine();
}
}
Public class shapeDisplay:IDisplay<shape>
{
Public void show(shape s)
{
Console.WriteLine(“ ”,s.GetType().Name.s.Width,s.Height);
}
}
Static void Main()
{
IDisplay<shape> shapeDisplay = new ShapeDisplay();
IDisplay<rectangle> rectangleDisplay = shapeDisplay;
rectangleDisplay.show(rectangles[0]);
}