我有几个类都在实现接口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
个孩子,并且不想重复该代码。有解决方案吗?
答案 0 :(得分:3)
我想你想要这个:
void Do(IBar bar)
{
dynamic dynamicThis = this;
dynamicThis.Handle((dynamic) bar);
}
这样,该方法将针对this
的实际类型找到。否则,编译器会记住该方法是从Foo
调用的,并且只动态处理参数,找到Foo
可用的实际类型{{}}的方法。 {1}}。您需要从bar
的实际类型中获得的方法,以及使用this
的实际类型(通过强制转换为bar
)。
(您需要公开dynamic
方法。)