3

我有一个类层次结构如下的库:

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化并在具体类中重载它。但是请记住BaseA并且B在图书馆中,所以我不能自由地添加dos方法。

添加方法扩展不起作用,因为无法添加抽象扩展。

有什么建议吗?

4

1 回答 1

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 */ }
}

自引入以来,C# 原生支持多次分派dynamic,因此在大多数情况下无需实现访问者模式。

于 2014-09-21T05:33:46.220 回答