c# - 调用方法的模式,它采用传递对象的最派生形式

标签 c#

当我遇到这种情况并意识到我不确定最佳解决方案是什么时,我感到很惊讶。

假设我有以下三种类型:

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/

相关文章:

javascript - Pusher 是否允许非 ASCII (JSON) 格式的传输负载?

c# - SQL 存储过程未返回小数位

c# - Rhino Mock 调用异步任务方法

c# - Azure 应用服务 - 同步期间日期时间更改

c# - 条件编译器类型定义

c# - 当用户开始编辑单元格文本时,如何以编程方式将光标放在文本的开头以编程方式编辑 DataGridView 单元格?

c# - 设置通用 WPF 控件的样式

c# - 你如何检查开放 Entity Framework 连接

c# - 从另一个类和线程的接口(interface)回调更新 winform

c# - 应用服务属于领域层还是应用层?