问题标签 [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.

0 投票
10 回答
695 浏览

c++ - 为什么 C++ 不允许您请求指向最派生类的指针?

(这个问题可能应该参考 Stroustrup 来回答。)

能够请求指向最派生类的指针似乎非常有用,如下所示:

但是这种机制在 c++ 中没有提供。为什么?

更新,激励示例:

假设您没有 Base 和 Derived 以及 Processor,而是:

但这在 C++ 中很难做到,需要像访问者模式这样的创造性解决方案。那么,问题是:为什么在 C++ 中这样做很棘手,而像“CAST_TO_MOST_DERIVED”这样的东西会让它变得更简单?

更新:维基百科无所不知

我认为 Pontus Gagge 有一个很好的答案。从关于Multiple Dispatch的 Wikipedia 条目中添加这一点:

“Stroustrup 提到他喜欢The Design and Evolution of C++中的 Multi-methods 概念,并考虑在 C++ 中实现它,但声称无法找到有效的示例实现(类似于虚函数)并解决一些可能的类型歧义问题. 他接着说,虽然这个特性仍然很好,但它可以使用双重调度或基于类型的查找表来近似实现,如上面的 C/C++ 示例中所述,因此对于未来的语言来说是一个低优先级特性修订。”

作为背景,您可以阅读有关Multi-Methods的一些摘要,这比我提到的那种调用要好,因为它们可以正常工作。

0 投票
1 回答
599 浏览

oop - 多调度多方法

它们是什么,它们之间有什么不同?

许多来源,如Wikipedia,声称它们是同一件事,但其他人明确表示相反,如这个问题中的sbi

第一:“访问者模式是一种在 C++ 中模拟双重调度的方法。” 这是,呃,不完全正确。实际上,双重分派是多重分派的一种形式,它是在 C++ 中模拟(缺失的)多方法的一种方式。

0 投票
3 回答
188 浏览

java - Invoking a method overloaded where all arguments implement the same interface

My starting point is the following:
- I have a method, transform, which I overloaded to behave differently depending on the type of arguments that are passed in (see transform(A a1, A a2) and transform(A a1, B b) in my example below)
- All these arguments implement the same interface, X

I would like to apply that transform method on various objects all implementing the X interface.

What I came up with was to implement transform(X x1, X x2), which checks for the instance of each object before applying the relevant variant of my transform.

Though it works, the code seems ugly and I am also concerned of the performance overhead for evaluating these various instanceof and casting. Is that transform the best I can do in Java or is there a more elegant and/or efficient way of achieving the same behavior?

Below is a trivial, working example printing out BA. I am looking for examples on how to improve that code. In my real code, I have naturally more implementations of 'transform' and none are trivial like below.

0 投票
1 回答
89 浏览

architecture - 什么是识别哪些特定游戏对象正在碰撞的好方法?

这是关于物理引擎的。一旦发生碰撞,它会返回两个游戏对象正在碰撞的信息。所有实体,如玩家、怪物、子弹等都是从 GameObject 派生(继承)的。

什么是识别哪些特定游戏对象正在碰撞的好方法?

枚举:我曾考虑过使用枚举,但是一旦您开始添加更多实体,就无法跟踪所有可能的组合。

编辑:我在这里找到了 C# 的潜在解决方案:http: //blogs.msdn.com/b/laurionb/archive/2009/08/13/multimethods-in-c-4-0-with-dynamic.aspx

但是,如果我必须在 C++ 中执行此操作,我该怎么做?

0 投票
1 回答
328 浏览

java - Java 7 的 MethodHandles 会提供多重分派吗?

方法句柄对象是否会直接提供使用multiple-dispatch调用方法的能力。如果是这样,是否只支持双重分派,或者分派机制是否会考虑尽可能多的参数?如果支持多分派,任何代码示例都将受到特别赞赏。

在此先感谢,
麦肯齐

0 投票
19 回答
287806 浏览

python - Python函数重载

我知道 Python 不支持方法重载,但我遇到了一个问题,我似乎无法以一种好的 Python 方式解决。

我正在制作一个角色需要射击各种子弹的游戏,但是我如何编写不同的函数来创建这些子弹?例如,假设我有一个函数可以创建一个以给定速度从 A 点行进到 B 点的子弹。我会写一个这样的函数:

但我想编写其他函数来创建项目符号,例如:

等等有很多变化。有没有更好的方法可以在不使用这么多关键字参数的情况下做到这一点,导致它变得有点难看。重命名每个函数也很糟糕,因为你得到了add_bullet1,add_bullet2add_bullet_with_really_long_name.

要解决一些答案:

  1. 不,我无法创建 Bullet 类层次结构,因为那太慢了。管理项目符号的实际代码是用 C 语言编写的,我的函数是 C API 的包装器。

  2. 我知道关键字参数,但检查各种参数组合变得很烦人,但默认参数有助于分配acceleration=0

0 投票
2 回答
899 浏览

architecture - (嵌套?)多次调度 [访客模式]

我的应用程序架构遇到了障碍。我刚刚开始使用访问者模式在运行时我不知道的抽象对象上执行特定的算法。我的问题是我的算法也取决于嵌套抽象类型的类型。

让我说明一下我的意思:

我有一个抽象的 DataSource 类。由此我实现了具体的 DataSourceReference 和 DataSourceExplicit 类。我还有一个抽象的报告类(反序列化的元数据),我从中实现了具体的报告类 ReportTypeA 和 ReportTypeB。创建这些对象时,它们的 DataSource 可以是任何扩展的 DataSource 类。

我需要两者,实际的 Report 类型和 DataSource 类型,以便我可以相应地执行。我可以使用访问者模式获得一致的报告类型,但不知道如何为 DataSource 做同样的事情

访问 Report 后我无法访问 DataSource,因为我会丢失 Report 的具体类型(因为您必须让它接受基本 Report 类型:Accept(SomeDataSourceVisitor d, MetaReport m) - 或对每种可能的 Report 类型进行重载,这违背了访问者模式的目的。看到我的问题了吗?

有任何想法吗?我想远离使用动态,因为它不需要新报告类型的开发人员来确保调度程序(访问者)支持新报告。

当前代码:

0 投票
3 回答
2960 浏览

c# - c#多个调度选项?

我有这些课程:

考虑这些局外人静态函数:

如果我写:

它会调用Foo(House)(编译时绑定)

如果我写:

它会调用Foo(Asset) (编译时绑定)

目标:访问运行时类型方法:

我有两个选择:

1)像这样使用动态:

2) 将功能从usingstatic移至overrideusing polymorphism mechanism

问题

还有其他方法吗(无需将函数移至polymorphism mechanism|| dynamic)?

0 投票
2 回答
1087 浏览

java - 使用invokedynamic实现多重dispatch

我想知道是否可以使用 Java7 的新invokedynamic字节码指令来实现Java 语言的多重分派。java.lang.invoke 下的新 API 是否有助于执行这样的事情?

我正在考虑的场景如下所示。(这看起来像是访问者设计模式的一个应用案例,但可能有一些原因表明这不是一个可行的选择。)

然后库类MultipleDispatch会做一些类似的事情:

(我知道MultiJava,但这可以以纯 Java 的方式实现吗?)

0 投票
4 回答
310 浏览

python - 在 python 中定义“重载”函数

我真的很喜欢“魔术方法”的语法或者它们在 Python 中被调用的任何东西,比如

通话

然后被翻译成

是否可以为“非魔法”功能模仿这种行为?在数值计算中,我需要 Kronecker 产品,并且渴望拥有“kron”函数,这样

实际上是

用例是:我有两个相似的类,比如矩阵和向量,它们都有 Kronecker 积。我想打电话给他们

矩阵和向量类定义在一个 .py 文件中,因此共享公共命名空间。那么,实现上述功能的最佳(Pythonic?)方法是什么?可能的解决方案:

1) 拥有一个 kron() 函数并进行类型检查

2)有不同的命名空间

3) ?