gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:08:02 25 4
gpt4 key购买 nike

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

假设我有以下三种类型:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com