【问题标题】:How to build double dispatch using extensions如何使用扩展构建双重调度
【发布时间】:2014-09-18 12:27:16
【问题描述】:

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

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 抽象化,并在具体类中重载它。但是请记住BaseAB 在库中,所以我不能随意添加dos 方法。

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

有什么建议吗?

【问题讨论】:

  • 除了在自己的 MyBase 中复制 Base、A、B 代码,MyA 扩展 MyBase ,MyB 扩展 MyBase 我真的没有看到其他选择。我记得当我使用 c# 时,我们不得不做这样的事情

标签: c# double-dispatch


【解决方案1】:

您可以只使用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# 原生支持多分派,因此在大多数情况下无需实现访问者模式。

【讨论】:

    猜你喜欢
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 2016-09-07
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多