当我遇到这种情况并意识到我不确定最佳解决方案是什么时,我感到很惊讶。
假设我有以下三种类型:
class A { }
class B : A { }
class C : A { }
以及以下三种方法:
DoSomething(A a){ }
DoSomething(B b){ }
DoSomething(C c){ }
我有一个 List<A>
其中包含类型 B 和 C 的对象
我想这样做:
foreach(A a in list) { DoSomething(a) }
并让它调用与底层类型最匹配的方法,
但当然这总是会调用 DoSomething(A a)
我不希望进行大量类型检查以获得正确的方法调用,并且我不想向类 A、B 或 、C 添加任何内容。
这可能吗?
最佳答案
这是静态类型语言中虚拟调度的一个众所周知的问题:它仅“虚拟地”处理一个参数(this
);对于所有其他参数,方法调用使用参数的静态类型 进行绑定(bind)。由于您的列表是 A
的列表,因此代码只会调用 A
重载。
你需要 multiple dispatch为了实现既定目标,并且由于除非您切换到 dynamic
,否则该语言不提供开箱即用的功能,因此您将不得不进行切换或自己实现。在做出此决定时(以及在决定如何在需要时实现多重分派(dispatch)时)需要考虑许多权衡因素,所以不要轻率地做这件事。
关于c# - 调用方法的模式,它采用传递对象的最派生形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13572282/