浏览 2193 次
锁定老帖子 主题:利用扩展方法解除范型特例化错误
精华帖 (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方法. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-04-07
还没写完~~我以为我想到的方法.
|
|
返回顶楼 | |