我有一个具有类的层次结构的库,如下所示:
class Base {}
class A : Base {}
class B : Base {}
现在我想根据我的对象的类型做不同的事情,无论是A还是B. 所以我决定去实现双重调度以避免检查类型。
class ClientOfLibrary {
public DoStuff(Base anObject)
{
anObject.MakeMeDoStuff(this);
}
private void DoStuffForanA(A anA);
private void DoStuffForaB(B aB);
}
现在,实现双重调度的规范方法是在MakeMeDoStuff
中使方法Base
抽象,并在具体类中重载它。但请记住,Base
,A
和B
位于库中,因此我无法自由添加do方法。
添加方法扩展无法正常工作,因为无法添加抽象扩展。
有什么建议吗?
答案 0 :(得分:2)
您可以使用dynamic
来电:
class ClientOfLibrary {
public DoStuff(Base o)
{
DoStuffInternal((dynamic)o);
}
private void DoStuffInternal(A anA) { }
private void DoStuffInternal(B aB) { }
private void DoStuffInternal(Base o) { /* unsupported type */ }
}
自引入dynamic
以来,C#本身支持多次调度,因此在大多数情况下不需要实现访问者模式。