浏览 291 次
|
精华帖 (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方法.
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2008-04-07
还没写完~~我以为我想到的方法.
|
|
| 返回顶楼 | |


