问题标签 [double-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.
c# - 不使用动态关键字的动态双重调度
我正在尝试将这个动态双重调度示例移植到 C#。我已经完成了这个示例,但我觉得我已经通过使用反射来创建所需的处理程序并调用适当的方法来简化类DynamicDispatch
中的方法。MessageBase
任何人都可以就如何更改它提供一些建议吗?该示例使用 C++ dynamic_cast 运算符,我不确定 C# 的等价物是什么。我不确定我的解决方案是正确/最好的方法。
注意:我使用的是 3.5,所以我不能使用动态关键字
这是代码:
即时消息
消息库
信息
处理程序
消息处理程序
派生消息一
派生消息二
DerivedMessageHandlerOne
DerivedMessageHandlerTwo
测试用例
c++ - 双调度和模板类
我有一个 C++ 代码,我在其中比较了从一个共同的母类派生的不同类,Foo
. 如果两个类的类型不同,则比较始终为false
。否则,它会比较特定于类的一些内部数据。
我的代码如下所示:
这很好用(我认为这是一个双重调度),我可以比较Bar
和Baz
只有指向Foo
.
但现在问题来了。我必须添加一个模板类:
问题是Foo
,我无法声明该方法isSameSpecific
,Qux*
因为它是虚拟的和模板的。
问题:有没有什么巧妙的方法来克服这个问题?
design-patterns - 我需要询问对象类,但这是一种不好的做法。这种情况的替代方案?
我在扩展应用程序时遇到问题。这是一个考勤记录系统。目前,每个员工都通过一张带有二维码的卡记录考勤。现在他们想加入指纹识别,直到他们要求两种形式的识别必须在系统中共存时才出现问题。因此,系统必须能够感知员工的二维码,以及他的指纹。
通过 .equalsTo(id) 方法在 QrIdStrategy 中修复它的方法是:
但是我知道询问对象的类是一种不好的做法,并且不想这样做。我该如何解决?
我想到了访问者模式,但是我仍然有比较两个不同类型的类的问题(因为系统可以扫描这两种类型中的任何一种)
c++ - 模板对象的访问者模式
我正在尝试为学术目的制作一个自定义碰撞引擎,但我陷入了一个一般的 c++ 编程问题,我已经拥有所有正常工作的几何图形,并且对于问题的范围,我有这个功能:
我还有以下课程需要完成实施
我的问题出现的地方是当我想创建一个列表collidable_object
并测试它们的交叉点 2 by 2。
我对谷歌做了一些研究,发现有一个基类collidable_object
可以让我将对象存储到列表中。但在那之后,我如何根据对象的特定几何形状测试对象?
我曾尝试实现访问者模式,但每次都卡住了,因为我不想硬编码所有可能的几何类型,因为我总是会调用intersetcs()
.
我还发现了一篇关于合作访客的文章,但这似乎很复杂。
有没有人有一个简单有效的解决方案?
编辑:我想避免列出几何图形的原因是因为我希望添加新几何图形相对容易,而不必在树状结构中查找文件。
EDIT2:这里是有关该intersetcs
方法的更多信息:intersects 方法基于标签调度以找到正确的几何图形,但几乎所有凸形都使用 GJK 算法,该算法只要求对象可以返回给定方向上最远的点。对于非凸形状,这些形状被分割成凸子形状,并且该过程重新开始。
没有统一的标准来查看是否intersects
能够处理最常用的给定形状furthest_along
,但球对球不能,而且球体聚合也不需要使用furthest_along
附加信息:我使用 VS2012 和 C++11
c++ - 使用函数指针的模板化双重调度
我正在尝试为学术目的制作一个自定义碰撞引擎,但我陷入了一个一般的 c++ 编程问题。我已经拥有所有可以正常工作的几何图形,并且碰撞测试也可以正常工作。
引擎使用这 2 个类来创建要测试的几何队列:
由于可能有多种几何类型,我不想手动指定要测试的任何碰撞。
相反,我使用这种“技术”来实现双重调度:
其中该函数check_object_collision
是一个模板函数,用于测试碰撞并已经过测试。
我的问题如下:函数中的get_hit_function
强制转换确实可以编译,但似乎很可疑......我是否在做一些可怕的错误,这将导致未定义的行为和多个噩梦,或者可以将模板成员函数指针从一个派生类转换为另一个派生类.
让我感到困惑的是,在 Visual c++ 2012 中,它可以编译并且似乎可以正常工作......
是什么让这个演员出现了可怕的错误?
我真的不明白强制转换函数指针意味着什么......
作为后续问题,是否有办法以安全的方式实现这一点
design-patterns - “双多态”:双调度模式,还是只是访问者模式?
我有一个
从中得出一个
我想要这些方法
和
根据 pPAYOFF 的运行时类型执行操作,但不诉诸
通常,
会做类似的事情
和
其中 CALL_TOYFD 和 PUT_TOYFD 是从 PAYOFF_TOYFD 派生的公共。之后,我希望能够写出类似的东西
其中 bc 是 BC_TOYFD 的一个实例,而 pPAYOFF 是指向 PAYOFF_TOYFD 的指针,这样 bc 和 pPAYOFF 的正确类型在运行时被解析。
我被告知要使用“双重调度”或“反向双重调度”模式,没有任何其他提示/精度。我试图在这个框架中实现它,但并不真正知道如何准确地做到这一点。顺便说一句,我将有“其他”类,如从 BC_TOYFD 派生的 DIRICHLET_TOYFD,为此我将不得不保存与我试图解决的问题相同的问题,因此我猜双分派在我的案例中付诸实践将不得不考虑这个约束。
任何帮助,将不胜感激 !
非常感谢 !
java - 如何使用双重调度来分析图形基元的交集?
我正在分析图形基元(矩形、直线、圆形等)的交互,并计算重叠、相对方向、合并等。这被引用为 Double Dispatch 的主要示例(例如Wikipedia)
自适应碰撞算法通常要求以不同方式处理不同对象之间的碰撞。一个典型的例子是在游戏环境中,宇宙飞船和小行星之间的碰撞与宇宙飞船和空间站之间的碰撞的计算方式不同。1
但我还没有理解主要的解释,我也一般不理解关于 SO 的答案。
我当前的代码(Java)使用超类 Shape 并且类似于:
在子类(此处为 Rect)中具有特定实现,例如
无论如何,我必须编写所有n*(n-1)/2
方法(并且已经这样做了)。我还必须有可扩展的代码以适应(比如说)以后的日期:
我不知道如何使用双重分派模式或双重分派模式的价值,我希望有一个使用 Java 图形原语或类似伪代码的具体示例。
更新:我接受了@Flavio,因为(我认为)它回答了所提出的确切问题。但是我实际上已经实现了@Slanec,因为它解决了我的问题并且(对我而言)更简单,更易于阅读。我有一个附属问题“解决方案是否取决于对称关系?”。
“A 与 B 相交”通常与“B 与 A 相交”相同,但“A 与 B 碰撞”并不总是与“B 与 A 碰撞”相同。(A == 汽车,B == 骑自行车的人)。可以想象,我的交叉点在未来可能不是对称的(例如“矩形部分遮住圆”不是对称的并且可能具有不同的语义。
@Flavio 很好地解决了维护问题,并指出编译器可以检查问题。@Slanec 通过反射来做到这一点,这看起来像是一种有用的维护辅助工具——我不知道性能损失是什么。
java - Java 双重分派和泛型
我需要扩展一个广泛使用双重调度模式的算法。
该算法操作一些不同的数据类(很多类),并且每个类都需要相同的扩展。
我不想修改现有的数据类(用于限制序列化问题),也不想修改算法类(用于限制回归)。所以我设计了一个使用新类的解决方案。
我想使用类似以下示例的内容,但 java 拒绝识别我的类型。
您知道如何解决它或您考虑其他解决方案,请随时回答。
谢谢
objective-c - 使用 SpriteKit 进行碰撞处理的双重调度
我正在使用 SpriteKit 的碰撞检测。它有一个如下所示的回调:
接触对象有两个物理体:
我的游戏会有很多对象,当然我可以测试一下categoryBitMask
,看看什么和什么发生了碰撞。但是考虑到我打算有很多种类(当然不超过 32 种)并且可能会动态引入新类型,那么进行动态双重调度以编码碰撞、爆炸、得分等逻辑的最优雅的方法是什么?从所有这些碰撞中?当然,我可以构建一个巨大的毛茸茸的 if 语句,但我希望有更干净的东西。
也许一个查找表存储适当的处理程序的选择器?然后我通过某种组合来索引查找表categoryBitMasks
?我很想听听一些建议。
javascript - JavaScript 中动态类型运算符的双重分派
我想以可以交换基础数字类型的方式制定代数表达式。如果你愿意,可以考虑复数、大整数、矩阵等。出于这个原因,我会写要么add(a, b)
要么a.add(b)
代替a + b
. 在静态类型语言中,我只需使用基于类型的函数重载add
来实现各种替代方案。但是对于 JavaScript,这不起作用,所以我正在寻找替代方案。执行的方法取决于两个操作数的类型。
我想出的一种方法是以下双重调度机制:
将表达式写为
a.add(b)
。通过以下方式为给定类型(例如我自己的
Complex
类型或内置Number
类型)实现该方法:因此,第二次调用的方法名称编码了操作数之一的类型。
实施专门的方法来处理所有组合。例如,设置
/li>
假设我知道所有类型,所以我可以确保处理所有组合。我现在困扰的更多的是这些对象的创建。
上述方法严重依赖于虚拟方法调度,所以我认为它需要某种继承。经典的构造函数没有问题,但是根据我刚刚做的这个jsperf,使用构造函数创建对象往往比对象文字慢。有时速度会慢很多,例如本例中的 Firefox。所以我不愿意为每个例如复数值中间体产生这种开销,只是为了让我的运算符重载工作。
我在这个 jsperf 中尝试的另一种方法是不使用原型,而是将虚拟方法存储为每个单个对象实例的属性。在几乎所有经过测试的浏览器上都运行得非常快,但在这里我担心对象的大小。我担心对象有两个实际的浮点值,但可能有多达 50 个不同的成员函数来处理所有成对的运算符重载。
第三种方法是使用一个add
函数以某种方式检查其参数的类型,然后根据它做出决定。可能在一些由一些数字类型标识符的组合索引的列表中查找实际实现。我还没有写出来做测试,但是这种类型检查感觉很慢,而且我也怀疑 JIT 编译器是否能够优化这种奇特的函数调度。
有没有办法欺骗当前的 JavaScript 实现对创建成本低且不占用过多内存的对象进行适当优化的双重分派?