机器视觉

自由、创新、技术、经典

枚举器,很简单,也很复杂

实际工作中,遇到这样一个情况。我已经设计好了一个类,比如说是三角形类吧,有一些静态方法是针对三角形集合的,如下形式:

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)

 

posted on 2008-12-02 17:28  塞伦盖蒂之鹰  阅读(300)  评论(0)    收藏  举报

导航