论坛首页 编程语言技术论坛

利用扩展方法解除范型特例化错误

浏览 1909 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-04-03  
这个也是在重构一个开源软件中想到的小技巧。我们先来看原型
public class A:IVisitbale{

  public void Accpet(Visitor visitor)
  {
     visitor.VisitItem(this)
  }
  public override String ToString()
  {
    return "A";
  }
}

public class ACollection:List,IVisitable
{
  public void Accpet(Visitor visitor)
  {
     visitor.VisitACollection(this);
  }
}


public class BCollection:List
{
  //donothing
}

public class Visistor
{
   public void VisitACollection(ACollection a)
   {
        VisitColllection(a);
   }
  
   public void VisitItem(A item)
   {
      System.Console.Out.WriteLine(A.ToString();
   }
  
   private void VisitCollection(ICollection col)
   {
     foreach(IVisitale v in col)
     {
          v.Accpet(this);
     }
   }  
}


为了范型化A,B两个Class,我们做如此重构
public class MyCollection<T>:List<T>,IVisitable
{

      public void Accept(Vistor vistor) //IVisitable member
      {
          Vistor.VisitCollection(this);
      }
}

public Class Vistor
{
   
   VisitGenericCollection(MyCollection<A> col)
   {
      VisitColllection(col);
   }

   VisitGenericCollection(MyCollection<B> col)
   {
        ....
   }

   public void VisitItem(A item)
   {
      System.Console.Out.WriteLine(A.ToString();
   }
  
   private void VisitCollection(ICollection col)
   {
     foreach(IVisitale v in col)
     {
          v.Accpet(this);
     }
   } 
}



这个例子并没办法编译,因为
      public void Accept(Vistor vistor) //IVisitable member   
      {   
          Vistor.VisitCollection(this);   
      } 
是无法特例化造型成MyCollection<A>和MyCollection<B>的,而且对于MyCollection<B>来说,也不应该有Accept方法.
   发表时间:2008-04-07  
还没写完~~我以为我想到的方法.
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics