问题标签 [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.
c# - Multiple Dispatch with Generics
I'm trying to abstract away my interface implementations by providing a factory/builder using generics. However, I'm running into an issue with multiple dispatch and C# generics at run time that's doing something that seems odd.
The basic scenario is I've defined several interfaces:
Then I have a factory class to return the actual implementations:
The issue is when the factory is called like this: new Factory().BuildModel<IAddressModel>()
The BuildModel(...) method that is dispatched at run time from generics is always the least derived form of T, in this case always object.
However, if you call new Factory().BuildModel(default(IAddressModel));
the correct method is displatched (most likely because this is done at compile time). It seems that dynamic dispatch with generics doesn't check the methods for the most derived type even though the method called should be the same whether it's done at compile time or run time. Ideally I'd like to make the BuildModel(...) methods private and only expose the generic method. Is there another way to get dynamic displatch to call the correct method at run time? I've tried changing the BuildModel<>()
implementation to return BuildModel((dynamic)default(T))
but this throws a run time error about not being able to determine which method to dispatch. Is there maybe a way to do this with contravariance and more interfaces?
c# - 如何在 C# 中的接口上进行多次调度?
假设我有以下类结构:
页
和接口由客户端实现Page
。它们根据页面类型(静态或动态)提供各种数据,由. 这些接口可能有很多实现。StaticPage
DynamicPage
Renderer
渲染器
Renderer
s 呈现页面。此外,此接口可能有多种实现(针对不同的渲染技术)。
渲染管理器
这只是一个简单的外观,它应该根据给定的页面类型在提供的渲染器上调用适当的渲染方法。这里是
问题
如何Renderer
根据提供的页面类型确定在对象上调用哪个方法?
当前(不满意)的解决方案
目前我正在使用条件调度:
怎么了
这个解决方案的问题是,每当我想添加另一种页面类型(即扩展Page
界面)时,我也需要调整这个方法。实际上,这就是面向对象语言中的多态(虚拟)方法应该用于的用途,但在这种情况下这不起作用(见下文原因)。
我考虑过但拒绝的其他解决方案
抽象类而不是接口。这将对实现者的类型层次结构施加不必要的约束:他们将不再能够扩展他们想要的任何类,而是被迫扩展抽象
StaticPage
或DynamicPage
类,这很糟糕。向接口添加一个
dispatch(Renderer render)
方法,并强制实现者根据页面类型调用渲染器对象上的适当方法。这显然很糟糕,因为实现者不应该关心渲染:他们只需要提供要渲染的数据。
那么,也许有一些模式或一些替代设计可能在这种情况下有所帮助?欢迎任何想法。:)
multiple-dispatch - 如何放宽方法中的要求
放宽要求是什么意思?例如,在一个简单的方法中,它接收两个 Integer 并将它们添加到另一个 Integer 中,如何放宽该方法中的要求?
Even 和 Natural 都扩展了 Integer 类,如果相关的话。这三个类都有不同的 add() 方法,Integer 是唯一一个在客户端以方法 f() 的形式拥有它的类。
c++ - C++中碰撞检测的多重分派?
我有圆圈、方框和线条。现在我想在它们之间实现碰撞检测。这意味着我必须对两种形状的每种组合都有一个函数。当然,我可以对直线与圆和圆与直线使用相同的方法,但我认为我的观点仍然成立。在 C++ 中实现这个的最优雅的方法是什么?
c++ - 派生类中的重载方法与多重调度
根据 Wikipedia,Multiple Dispatch是
...可以根据多个参数的运行时(动态)类型动态分派函数或方法。
但是,在 C++ 中,我可以覆盖派生类中的函数:
这里method
是在运行时绑定的(因为我正在使用virtual
),并且根据输入参数选择特定的方法——这与维基百科对多调度的描述有什么不同?
第二个问题:如果 C++ 中存在这种多态性和方法重载的组合,那么支持多分派的语言有什么优势(如果有的话)?
julia - 返回值的多次分派
我有一个例程可以返回任何 FloatingPoint 类型的数组(或者实际上是任何数字类型,但它适用于浮点)。它计算连分数的收敛性。我的问题是我希望编译器为每个返回类型优化它,例如 Float64、BigFloat 等,而不是使用通用代码。
对我来说似乎可行的唯一解决方案是将结果数组作为参数传递并使其成为参数函数
我看到的唯一问题是,除了指定其类型之外,没有理由将结果数组作为参数提供。这似乎不是“正确”的事情。
c++ - 三重调度设计
我有类似以下的情况:
有些事件是 的子类型,Event
有些是 的子类型SpecialEvent
。这些事件被添加到Event
s 队列中,然后我需要使用SpecialEventHandler
.
问题是处理特殊事件,因为唯一Accept
可以调用的方法是其中的一个,Event
因此只能EventHandler
传入一个。我有一个使用双访问者模式的解决方案,但这既笨重又令人困惑。
- 这种情况有模式吗?
- 有没有更好的设计方法?
c++ - Loki 多方法是否进入了 C++11?
我正在阅读Andrei Alexandrescu所应用的Modern C++ Design Generic Programming and Design Patterns和关于多方法的第 11 章,这正是我试图解决的问题。本书的所有源代码都发布在一个名为Loki的库中。
问题是这本书相当旧(2001 年),并且处理了C++11 中不再适用的限制(例如,模板参数的数量不能是可变的)。我试图查找 Loki 是否已使用 C++11 重写,但最后一次修改日期为 2009 年,并且Andrei Alexandrescu 的主页上没有更新。然而,在做了一些研究之后,我觉得 Loki 有点像 Boost,因为它被合并到了标准库中。
多方法习语或它的某些部分是否已被 C++11 采用?
arrays - 处理多种类型和数组时如何编写“好”的 Julia 代码(多重分派)
OP 更新:请注意,在最新版本的 Julia (v0.5) 中,回答这个问题的惯用方法是定义mysquare(x::Number) = x^2
. 使用自动广播覆盖向量化的情况,即x = randn(5) ; mysquare.(x)
。另请参阅更详细地解释点语法的新答案。
我是 Julia 的新手,并且鉴于我的 Matlab 起源,我在确定如何编写利用多重调度和 Julia 类型系统的“好” Julia 代码时遇到了一些困难。
考虑我有一个提供平方的函数的情况Float64
。我可以这样写:
有时,我想Float64
在一维数组中对所有 s 进行平方,但不想mysquare
每次都写出一个循环,所以我使用多个调度并添加以下内容:
但现在我有时会使用Int64
,所以我写了两个利用多重调度的函数:
这是正确的吗?还是有更符合意识形态的方法来处理这种情况?我应该使用这样的类型参数吗?
这感觉很明智,但是我的代码会像我避免参数类型的情况一样快速运行吗?
总之,我的问题有两个部分:
如果快速代码对我很重要,我应该使用上述参数类型,还是应该为不同的具体类型编写多个版本?还是我应该完全做其他事情?
当我想要一个对数组和标量进行操作的函数时,编写两个版本的函数是否是一种好习惯,一个用于标量,一个用于数组?还是我应该完全做其他事情?
最后,请指出您可以在上面的代码中想到的任何其他问题,因为我的最终目标是编写好的 Julia 代码。
oop - Julia:了解 OOP 的多重调度
可以说我有以下类型:
我想为它们添加一个方法describe
来打印它们内部的数据。最好使用方法来做到这一点:
输出:
或者我应该使用我之前发布的这个问题中的函数:Julia: What is the best way to setup a OOP model for a library
哪种方法更有效?
文档中的大多数Methods
示例都是简单的函数,如果我想要更复杂的循环或 if 语句是否可能?Method