using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Example
{
public class Shape //形状基类
{
public double Width { get; set; }
public double Height { get; set; }
}
public class Rectangle : Shape //矩形子类
{
public void Sum()
{
Console.WriteLine(Width + Height);
}
}
public interface IIndex<out T> //接口,通过不同的类实现接口的内容,通过不同类的接口实现部分来达到接口的多态功能
{ //接口是协变的,即同子类转换为父类的方向是一致的,意味着返回类型只能是T
T this[int index] { get; } //this代表接口
int Count { get; }
}
public interface IDisplay<in T> //泛型接口是抗变的,T只能做为其方法的输入
{
void Show(T item);
}
public class RectangleCollection : IIndex<Rectangle>
{
private Rectangle[] data = new Rectangle[3]
{
new Rectangle{Height=2,Width=5},
new Rectangle{Height=3,Width=7},
new Rectangle{Height=4.5,Width=2.9}
};
public static RectangleCollection GetRectangles()
{
return new RectangleCollection();
}
public Rectangle this[int index]
{
get
{
if (index < 0 || index > data.Length)
{
throw new ArgumentOutOfRangeException("index");
}
return data[index];
}
}
public int Count
{
get
{
return data.Length;
}
}
}
public class ShapeDisplay : IDisplay<Shape>
{
public void Show(Shape s)
{
Console.WriteLine("{0}Width:{1},Height:{2}", s.GetType().Name, s.Width, s.Height);
}
}
class Program
{
static void Main()
{
RectangleCollection rectangles = RectangleCollection.GetRectangles(); //建立一个类实例
IIndex<Shape> shapes = rectangles; //实现接口,此时接口的内容相当于下面注释掉的代码
for (int i = 0; i < shapes.Count; i++)
{
//shapes[i]为Rectangle类型
Console.WriteLine("{0},{1},{2}", shapes[i].Height, shapes[i].Width, shapes[i].GetType());
}
/*public Shape this[int index]
{
get
{
if (index < 0 || index > data.Length)
{
throw new ArgumentOutOfRangeException("index");
}
return data[index];
}
}
public int Count
{
get
{
return data.Length;
}
}*/
IDisplay<Shape> shapeDisplay = new ShapeDisplay(); //建立一个实例,此时接口函数为void Show(Shape item);
IDisplay<Rectangle> rectangleDisplay = shapeDisplay;//此时接口函数转换为void Show(Rectangle item);
rectangleDisplay.Show(rectangles[0]);
}
}
}
C#协变抗变
本文转载:CSDN博客