如何使用扩展构建双重调度
我有一个具有类的层次结构的库如下:
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); }
现在实现双重调度的规范方法是在Base
中使方法MakeMeDoStuff
抽象并在具体类中重载它。 但请记住Base
, A
和B
都在库中,所以我不能自由地添加do方法。
添加方法扩展无法工作,因为无法添加抽象扩展。
有什么建议吗?
你可以使用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#本身支持多个调度,因此在大多数情况下不需要实现访问者模式。