问题标签 [dynamic-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 投票
1 回答
8293 浏览

ios - Swift 函数中的动态修饰符

根据苹果:

当您使用修饰符标记成员声明时dynamic,始终动态调度对该成员的访问。因为使用dynamic修饰符标记的声明是使用 Objective-C 运行时调度的,所以它们被隐式标记为@objc属性。

根据维基百科:

动态分派是选择在运行时调用哪个多态操作(方法或函数)实现的过程。

当不同的类由于共同的继承而包含相同方法的不同实现时,动态分派通常用于面向对象的语言中。例如,假设您有类ABC,其中B和都从C继承方法。现在假设是一个变量 class 。在运行时,实际上可能有一个类型的值,或者通常你在编译时不知道它是什么。foo()AxAxBC

现在,我正在研究 依赖注入框架:Typhoon ,当我在从 Objective-C 类继承的所有类中打开Swift的示例项目时,所有TyphoonAssembly注入依赖关系的方法都具有以下dynamic修饰符:

我以为我遗漏了一些东西,但我不明白在这里运行时要调用的多态操作(方法或函数)在哪里。

这里动态调度的目的是什么?

0 投票
3 回答
634 浏览

oop - 多次调度:概念上的必要性?

我想知道多重分派的概念(即内置支持,就好像虚拟方法的动态分派也扩展到方法的参数一样)是否应该包含在面向对象的语言中,如果它对性能的影响是微不足道。

问题

考虑以下场景:我有一个——不一定是扁平的——包含动物类型的类层次结构。在我的代码中的不同位置,我想对动物对象执行一些操作。我不关心,也无法控制如何获得这个对象引用。我可能会通过遍历动物列表遇到它,或者它可能作为方法的参数之一提供给我。我要执行的操作应该根据给定动物的运行时类型进行专门化。此类行动的示例包括:

  • 为动物构建一个视图模型,以便在 GUI 中显示它。
  • 构造一个表示这种动物的数据对象(稍后存储到数据库中)。
  • 给动物喂一些食物,但根据动物的类型给予不同种类的食物(什么对它更健康)

所有这些例子都在动物对象的公共 API 上操作,但它们所做的不是动物自己的事情,因此不能放入动物本身。

解决方案

一种“解决方案”是执行类型检查。但是这种方法容易出错并且使用反射特性,这(在我看来)几乎总是表明设计不好。类型应该只是一个编译时概念。

另一种解决方案是“滥用”(某种程度)访问者模式来模仿双重调度。但这需要我改变我的动物以接受访客。

我相信还有其他方法。另外,扩展的问题要解决:如果有新类型的动物加入聚会,需要调整多少代码位置,如何可靠地找到它们?

问题

那么,鉴于这些要求,多重分派不应该是任何设计良好的面向对象语言的一个组成部分吗?
使外部(不仅仅是内部)动作依赖于给定对象的动态类型不是很自然吗?

此致!

0 投票
0 回答
162 浏览

casting - 我怎样才能施放 Rc到 Rc>>

我有一个 traitMyTrait和一个MyStruct实现MyTrait.

我还有一个接受Rc<RefCell<Box<MyTrait>>>作为参数的函数。

在代码的某处,我创建了一个实例Rc<RefCell<Box<MyStruct>>>

当我传递my_struct给我的函数时,我得到一个编译器错误:

错误:不匹配的类型:预期alloc::rc::Rc<core::cell::RefCell<Box<MyTrait>>>,找到alloc::rc::Rc<core::cell::RefCell<Box<MyStruct>>>

我尝试Rc<RefCell<Box<MyStruct>>>通过显式指定我需要的类型来创建一个实例来解决这个问题:

在这种情况下,传递my_struct给我的函数可以正常工作,但是我不能再通过变量访问任何MyStruct特定字段。my_struct而且这似乎不是一种贬低Rc<RefCell<Box<MyTrait>>>Rc<RefCell<Box<MyStruct>>>.

我该如何解决这个问题?

0 投票
2 回答
651 浏览

ruby - 嵌套单例类方法查找

首先,我知道这个问题在现实世界中没有应用,我只是好奇。

想象一下,我们有一个带有单例方法的类:

如果我们调用Foo.bar,它将首先在 的每个祖先的单例类中搜索一个方法Foo,然后在.class方法及其祖先引用的类中查找。我们可以用 来确认Foo.singleton_class.ancestors,它返回:

但是如果我们有一个嵌套的单例类会发生什么,比如:

如果我们调用Foo.singleton_class.singleton_class.ancestors,它会返回:

我不明白这个层次结构是如何组织的。

0 投票
3 回答
1385 浏览

c# - C#函数具有多态性

我正在尝试为基于类层次结构的数据结构实现访问者模式。在 C# 中,你不能打开类型(还)。我正在考虑做这样的事情作为替代:

然后用后期绑定调度调用它:

但是,这不起作用,因为MyAlgorithm不能从 delegate 继承Func<...>

我看到的唯一解决方案是定义很多我自己的接口,如下所示。有没有更好的办法?

0 投票
1 回答
217 浏览

java - 将 Java 中的变量参数调整为 Java 中的固定参数

我有一个适配器,旨在将变量参数的调用转换为指定的方法目标。示例代码如下所示。

方法execute () 接受一个可变参数。根据args中的元素,Adapter 会选择一个具有一致方法类型的runX函数来执行。例如,如果 args 中的前两个元素都是 int,则将选择 run1。匹配规则为:

有没有在方法执行中进行这种调用转换的好方法?在 Java 中,变量argsArray是相同的。由于组合空间太大,无法迭代 args 中的每个元素以找到匹配的方法run 。


需要一个接受可变参数的 API,说:

然后我为许多指定类型的情况提供了一些优化的实现版本,当 args 中的元素类时。

0 投票
4 回答
207 浏览

c++ - Alternative to virtual templates

I have a class storing a fixed size amount of data

Now I have different algorithms for generating data (e.g. pseudorandom generators):

Now I want to have a dynamic runtime decision as to which of these generators to call. Using virtual templates (which, I know, is not possible), it would be the following:

Unfortunately, I cannot change the SIZE parameter of the data class to be a non-template runtime parameter. Furthermore, I need the actual generator instance to be a runtime decision, because the user can choose a generator algorithm. If possible, I'd prefer a typesafe solution (i.e. no boost::any).

I know virtual templates are not possible. Is there another way to solve this?

0 投票
4 回答
963 浏览

python - Python中的函数模式/谓词匹配

我希望能够调度函数的不同实现,不仅基于第一个参数的类型,而且基于任意谓词。目前我必须这样做:

以下是我希望能够做的事情的精神:

它类似于 Python 3 的singledispatch,但singledispatch仅支持对类型进行分派,而不支持对任意谓词进行分派。

TL;DR:是否有一个库允许基于任意谓词(不仅是参数的类型)对函数进行基于谓词的调度?

0 投票
3 回答
203 浏览

prolog - 通过 OO Prolog 中的多方法碰撞恒星物体?

我想知道如何在 Prolog 中结合统一和 OO。我想在术语对象上实现多方法调度。

如果没有术语对象和简单术语,我将执行以下操作,并且可以从多参数索引中受益:

但上面只给出了精确的类型匹配。

如果我想要一个子类类型匹配,我应该怎么做(可能还有更多的宇宙飞船子类,如 excelsior、galaxy 等。在案例 2,3 和 4 中也应该匹配)。

我还能使用统一和索引吗?

再见

PS:示例来自这里,它没有 Prolog 解决方案:
https ://en.wikipedia.org/wiki/Multiple_dispatch

0 投票
1 回答
88 浏览

c++ - 在类之外声明的方法的动态调度

我试图理解一个库实现,但一些方法动态链接的方式让我感到困惑。我知道使用派生类的对象时的调度机制,但是没有对象我不知道它是如何工作的。我想了解的库是来自 gcc的libitm 。

头文件libitm.h将所有 ABI 方法声明为顶级方法,它们周围没有类或结构。对于它们中的大多数,我找到了一个独特的定义,所以我对它们没有任何疑问,我在这里省略了它们。但是下面的摘录显示了 70 个方法的声明,这些定义让我感到困惑。

在文件dispatch.h中声明了一个结构体 abi_dispatch,它被用作特定 TM 算法调度的基础。在这个结构中,上面 70 个方法的声明都是纯虚方法。以下摘录显示了方法和结构的宏定义。

abi_dispatch 的派生结构可以在例如method-mlmethod-gl中找到。他们使用 CREATE_DISPATCH_METHODS(virtual, ) 和上面的宏来生成 70 个读/写方法并将它们映射到加载/存储模板函数。

我的大问题是:运行时系统如何知道在调用库函数之一时应该使用哪个方法定义(method-gl 或 method-ml 中的那个)?在读/写方法的定义中,没有提到 abi_dispatch 对象。线程本地存储中存在一个 abi-dispatch 对象,但我不知道它如何适应这个。

感谢您的帮助。