问题标签 [multiple-dispatch]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
oop - 多态性和多分派有什么区别?
...或者它们是同一件事吗?我注意到每个都有自己的 Wikipedia 条目:Polymorphism、Multiple Dispatch,但我无法看到这些概念的不同之处。
编辑:重载如何适应这一切?
java - 在没有双重调度/访问者模式的情况下解决 Java 的静态方法调度
我正在使用一个Foo
提供这些方法的类:
由于 Java 在 non-receiver 参数上静态分派,我不能只传递 my value
(这是一个Object
,但可能具有动态类型Goo
)并依赖 JVM 动态选择“正确”方法。
这是我目前(丑陋)的解决方法:
有没有更好的方法可以在不修改Foo
(包含重载方法的类)中的代码的情况下做到这一点?
c# - C# 是单调度语言还是多调度语言?
我试图准确地理解单次和多次调度是什么。
我刚读到这个:
http ://en.wikipedia.org/wiki/Multiple_dispatch
从这个定义来看,在我看来,C# 和 VB.Net 是多调度的,即使在编译时选择调用哪个重载也是如此。
我在这里是正确的,还是我错过了什么?谢谢!
c# - 什么是 - 单次和多次调度(与 .NET 相关)?
是否与重载相同,如果不是,请您提供每个 C# 中的示例
我已经阅读了对 SO 中提出的类似问题的回复......我不明白发布给它的回复。
类似的问题在这里问
编辑:在 C# 4.0 中使用新的“动态”关键字......这会使语言“多调度”启用吗?
c++ - C++ 中的多重分派
我试图了解什么是多次调度。我阅读了很多不同的文本,但我仍然不知道多重调度是什么以及它有什么好处。也许我缺少的是使用多次调度的一段代码。拜托,你能用 C++ 编写一小段代码,使用多次调度,这样我就可以看到它不能正确编译/运行,因为 C++ 只有一次调度?我需要看到区别。谢谢。
c++ - 派生对象之间的特殊交互(即多重分派)
所以,我有一个基类指针列表:
然后,在某个时候,其中一个对象将查看所有其他对象。
我想要实现的是,根据派生类型obj
和派生类型*it
,它们之间的交互方式会有所不同,即DerivedA
如果与 交互,则会破坏自身DerivedB
,但前提是DerivedB
设置了属性bool c = true;
。所以像:
在编译时,它们都是Base
-pointers 并且不能互相调用并期望类型神奇地出现。如果这是一种单向关系,即我知道其中一种是什么类型,我可以使用访问者模式。我相信我应该使用某种Mediator 模式,但无法真正弄清楚如何因为 mediator 也将持有Base
-pointers,因此它不会有所作为。
我不知道如何继续……有人吗?
背景:
我正在创建一个游戏,这个问题源于Room
跟踪它的内容的类,即GameObject
房间里当前有什么。
有时,一个物体会移动(例如,玩家)。然后房间将遍历即将移动的地砖上的所有对象(上面的循环),并检查对象是否会相互交互。
例如,如果它是一个Troll
想要Player
伤害它的人。或者他只是想伤害来自任何另一个“团队”(可以从所有实现的函数访问)的任何Character
(两者Troll
都Player
来自)。Character
getAlignment()
Characters
c++ - 具有两个可以采用多种不同类型的操作数的虚函数
让我从一个具体的例子开始。在 C++ 中,我在抽象基类下有一个类层次结构CollisionVolume
。任何碰撞体积都需要能够detectCollision
与任何其他体积。这个碰撞代码是专门基于存在的两个子类的,但它是可交换的:detectCollision(a, b) == detectCollision(b, a)
.
我需要使用类似于虚函数的机制,因为对象通常属于抽象基类。但是,如果我使用典型的虚方法,则选择的函数只能取决于操作数之一的类型,而不是两者。我能够做到这一点的唯一方法是使用 RTTI 或类似 RTTI 的机制。
有没有更清洁的方法来做到这一点?
c# - 在 C# 中优化多调度通知算法?
对不起标题,我想不出更好的方式来描述这个问题。基本上,我正在尝试在游戏中实现碰撞系统。我希望能够注册一个“碰撞处理程序”来处理可以转换为特定类型的两个对象(以任意顺序给出)的任何碰撞。因此,如果Player : Ship : Entity
和Laser : Particle : Entity
,以及 和 的处理程序注册 ,(Ship, Particle)
而(Laser, Entity)
不是 的冲突(Laser, Player)
,则应通知两个处理程序,并以正确的顺序提供参数,并且 的冲突(Laser, Laser)
应仅通知第二个处理程序。
一个代码片段说了一千个单词,所以这就是我现在正在做的事情(naieve 方法):
但是,这种方法很慢(可测量;我在实施后损失了大约 2 FPS),所以我正在寻找一种方法来减少几个周期/分配。
我想到了(例如,花了一个小时实现然后因为自己是个白痴而将头撞到墙上)一种方法,该方法根据它们的哈希码将类型按顺序排列,然后将它们放入字典中,每个条目都是该类型对的处理程序的链接列表,带有布尔值指示处理程序是否希望反转参数的顺序。不幸的是,这不适用于派生类型,因为如果传入派生类型,它不会通知基类型的订阅者。谁能想到比检查每个类型对(两次)以查看它是否匹配更好的方法?
谢谢,罗伯特
c# - .NET 4.0 中的新“动态”变量类型是否解决了 CLR 中的单/多方法分派问题?
对于使用 Java 和 C# 等静态类型语言进行编码的人来说,单次分派问题最为熟悉。基本思想是:
而运行时多态性允许我们根据 的类型(运行时类型)调度到正确的方法调用receiver
,例如:
方法调用会根据 的运行时类型进行mything
,即Cat
. 这是单一的分派能力(存在于 Java/C# 中)。
现在,如果您不仅需要在接收器的运行时类型上进行分派,而且还需要在(多个)参数的类型上进行分派,那么您将面临一个小问题:
第二种方法永远不会被调用,因为在我们的“消费者”代码中,我们只是倾向于通过它们共同的超类型或接口来处理不同类型的对象(在我的示例中是访问者)。
这就是我问的原因——因为动态类型允许多重分派多态性,而 C# 4.0 具有动态关键字;)
c++ - 苹果、橙子和指向最衍生的 c++ 类的指针
假设我有一堆水果:
以及对所述水果起作用的一些多态函数:
好,等一下。停在那儿。请注意,任何理智的人都会让 Eat() 成为 Fruit 类的虚拟成员函数。但这不是一个选择,因为我不是一个理智的人。另外,我不想在我的水果类的头文件中使用 Pesticide*。
可悲的是,我接下来想要做的正是成员函数和动态绑定所允许的:
很明显,这里的问题是我们传递给 Eat() 的指针将是 Fruit*,而不是 Apple* 或 Orange*,因此没有东西会被吃掉,我们都会非常饿。
所以我真正想做的不是这个:
这是:
但据我所知,这种魔法并不存在,除了可能是一个充满了对 dynamic_cast 调用的讨厌的大 if 语句的形式。
那么是否有一些我不知道的运行时魔法?或者我应该实现和维护一个充满动态转换的大麻烦 if 语句?还是我应该接受它,放弃思考如何在 Ruby 中实现它,并让一点 Pesticide 进入我的水果头?
更新:与其做人为的只吃功能和杀虫剂,不如假设我只是不想把吃放在水果里,因为它没有意义。会吃自己的水果?普肖。相反,我需要一个带有 Eat 函数的 Eater 类,使用不同的代码来吃每种水果,以及一些默认代码,以防它是食客无法识别的水果:
但同样,这不起作用,C++ 中的直接解决方案似乎是对 dynamic_cast 的一堆调用。
但是,正如其中一个答案所暗示的那样,可能还有另一个聪明的解决方案。如果 Fruits 使用 MustPeel() 和 MustWash() 之类的函数暴露出对食客很重要的品质会怎样?然后你可以用一个 Eat() 函数来解决......
更新: Daniel Newby 指出,使用 Visitor 也可以解决所提出的问题……但这需要一些语义倒立(Fruit::use 或 Fruit::beEaten?)。
虽然我想接受几个答案,但我认为 psmears 的答案实际上是未来读者的最佳答案。感谢大家。