枚举器,很简单,也很复杂
实际工作中,遇到这样一个情况。我已经设计好了一个类,比如说是三角形类吧,有一些静态方法是针对三角形集合的,如下形式:
class triangle
{
// 顶点坐标
private point[] points;
....
// 计算批量三角形的最大包含矩形
public static Rectangle CompMBR(List<triangle> ts);
// 计算批量三角形的交点集合
public static List<Point> intersects(List<triangle> ts);
}
好了,现在需要派生一个类,假如说是等边三角形吧,我怎么设计才能利用上三角形的静态方法?
不要说在派生类中再定义这些静态方法,然后构造出三角形的集合,那效率会相当低下的,工作量太大也不允许。
class special_triangle : triangle
{
???
}
解决方案:枚举器设计模式。把三角形类改造成如下模样:
class triangle
{
// 顶点坐标
private point[] points;
....
// 计算批量三角形的最大包含矩形
public static Rectangle CompMBR(IEnumerator tri_iterator);
// 计算批量三角形的交点集合
public static List<Point> intersects(IEnumerator tri_iterator);
}
静态方法里面用到了强制类型转换,不能用上泛形类IEnumerator<T>或IEnumeratable<T>.
好的消息是:DotNet 5.0据说支持泛型集合直接类型转换。(2011.12.15)
==================
C# 4.0的协变和逆变可以完美解决这个问题。
例如基本类的方法参数可以采用IEnumeratable<T>,IReadOnlyList<T>等,
就能直接使用List<派生类>做为参数了(2013.4.6)
浙公网安备 33010602011771号