4

我有几个类都实现了一个接口IBar。这些类是BarA, BarB, BarC

我也有一个基类Foo

abstract class Foo
{
    void Do(IBar bar)
    {
        Handle((dynamic)bar);
    }

    void Handle(IBar bar)
    {
        Console.Out.WriteLine("Fallback Scenario");
    }
}

我想要一个FooChild如下的子类:

class FooChild : Foo
{
    void Handle(BarA bar) {
        Console.Out.WriteLine("Handling BarA");
    }

    void Handle(BarB bar) {
        Console.Out.WriteLine("Handling Bar");
    }
}

不,我想做以下事情,但我没有得到我期望的结果

var foo = new FooChild();
foo.Handle(new BarA()); // expected: Handling BarA, actual: Fallback Scenario
foo.Handle(new BarB()); // expected: Handling BarB, actual: Fallback Scenario
foo.Handle(new BarC()); // expected: Fallback Scenario, actual: Fallback Scenario

我可以通过将Do(IBar bar)方法移动到FooChild类来解决它,但我不想这样做。我可能有 10 个Foo孩子,不想重复那个代码。有解决方案吗?

4

1 回答 1

4

我想你想要这个:

void Do(IBar bar)
{
    dynamic dynamicThis = this;
    dynamicThis.Handle((dynamic) bar);
}

这样,将根据实际类型找到该方法this。否则,编译器会记住该方法是从 调用的Foo,并且只动态处理参数,查找可以从Foo的实际类型获得的方法bar。您想要的方法可以从 的实际类型中获得this,也可以使用 的实际类型bar(通过强制转换为dynamic)。

(不过,您需要Handle公开这些方法。)

于 2013-05-22T12:20:36.857 回答