如何使用扩展构建双重调度

时间:2014-09-18 12:27:16

标签: c# double-dispatch

我有一个具有类的层次结构的库,如下所示:

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抽象,并在具体类中重载它。但请记住,BaseAB位于库中,因此我无法自由添加do方法。

添加方法扩展无法正常工作,因为无法添加抽象扩展。

有什么建议吗?

1 个答案:

答案 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#本身支持多次调度,因此在大多数情况下不需要实现访问者模式。