问题标签 [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.
ios - Swift 函数中的动态修饰符
根据苹果:
当您使用修饰符标记成员声明时
dynamic
,始终动态调度对该成员的访问。因为使用dynamic
修饰符标记的声明是使用 Objective-C 运行时调度的,所以它们被隐式标记为@objc
属性。
根据维基百科:
动态分派是选择在运行时调用哪个多态操作(方法或函数)实现的过程。
当不同的类由于共同的继承而包含相同方法的不同实现时,动态分派通常用于面向对象的语言中。例如,假设您有类
A
、B
和C
,其中B
和都从C
继承方法。现在假设是一个变量 class 。在运行时,实际上可能有一个类型的值,或者通常你在编译时不知道它是什么。foo()
A
x
A
x
B
C
现在,我正在研究 依赖注入框架:Typhoon ,当我在从 Objective-C 类继承的所有类中打开Swift的示例项目时,所有TyphoonAssembly
注入依赖关系的方法都具有以下dynamic
修饰符:
我以为我遗漏了一些东西,但我不明白在这里运行时要调用的多态操作(方法或函数)在哪里。
这里动态调度的目的是什么?
oop - 多次调度:概念上的必要性?
我想知道多重分派的概念(即内置支持,就好像虚拟方法的动态分派也扩展到方法的参数一样)是否应该包含在面向对象的语言中,如果它对性能的影响是微不足道。
问题
考虑以下场景:我有一个——不一定是扁平的——包含动物类型的类层次结构。在我的代码中的不同位置,我想对动物对象执行一些操作。我不关心,也无法控制如何获得这个对象引用。我可能会通过遍历动物列表遇到它,或者它可能作为方法的参数之一提供给我。我要执行的操作应该根据给定动物的运行时类型进行专门化。此类行动的示例包括:
- 为动物构建一个视图模型,以便在 GUI 中显示它。
- 构造一个表示这种动物的数据对象(稍后存储到数据库中)。
- 给动物喂一些食物,但根据动物的类型给予不同种类的食物(什么对它更健康)
所有这些例子都在动物对象的公共 API 上操作,但它们所做的不是动物自己的事情,因此不能放入动物本身。
解决方案
一种“解决方案”是执行类型检查。但是这种方法容易出错并且使用反射特性,这(在我看来)几乎总是表明设计不好。类型应该只是一个编译时概念。
另一种解决方案是“滥用”(某种程度)访问者模式来模仿双重调度。但这需要我改变我的动物以接受访客。
我相信还有其他方法。另外,扩展的问题要解决:如果有新类型的动物加入聚会,需要调整多少代码位置,如何可靠地找到它们?
问题
那么,鉴于这些要求,多重分派不应该是任何设计良好的面向对象语言的一个组成部分吗?
使外部(不仅仅是内部)动作依赖于给定对象的动态类型不是很自然吗?
此致!
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>>>
.
我该如何解决这个问题?
ruby - 嵌套单例类方法查找
首先,我知道这个问题在现实世界中没有应用,我只是好奇。
想象一下,我们有一个带有单例方法的类:
如果我们调用Foo.bar
,它将首先在 的每个祖先的单例类中搜索一个方法Foo
,然后在.class
方法及其祖先引用的类中查找。我们可以用 来确认Foo.singleton_class.ancestors
,它返回:
但是如果我们有一个嵌套的单例类会发生什么,比如:
如果我们调用Foo.singleton_class.singleton_class.ancestors
,它会返回:
我不明白这个层次结构是如何组织的。
c# - C#函数具有多态性
我正在尝试为基于类层次结构的数据结构实现访问者模式。在 C# 中,你不能打开类型(还)。我正在考虑做这样的事情作为替代:
然后用后期绑定调度调用它:
但是,这不起作用,因为MyAlgorithm
不能从 delegate 继承Func<...>
。
我看到的唯一解决方案是定义很多我自己的接口,如下所示。有没有更好的办法?
java - 将 Java 中的变量参数调整为 Java 中的固定参数
我有一个适配器,旨在将变量参数的调用转换为指定的方法目标。示例代码如下所示。
方法execute () 接受一个可变参数。根据args中的元素,Adapter 会选择一个具有一致方法类型的runX函数来执行。例如,如果 args 中的前两个元素都是 int,则将选择 run1。匹配规则为:
有没有在方法执行中进行这种调用转换的好方法?在 Java 中,变量args和Array是相同的。由于组合空间太大,无法迭代 args 中的每个元素以找到匹配的方法run 。
需要一个接受可变参数的 API,说:
然后我为许多指定类型的情况提供了一些优化的实现版本,当 args 中的元素类时。
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?
python - Python中的函数模式/谓词匹配
我希望能够调度函数的不同实现,不仅基于第一个参数的类型,而且基于任意谓词。目前我必须这样做:
以下是我希望能够做的事情的精神:
它类似于 Python 3 的singledispatch
,但singledispatch
仅支持对类型进行分派,而不支持对任意谓词进行分派。
TL;DR:是否有一个库允许基于任意谓词(不仅是参数的类型)对函数进行基于谓词的调度?
prolog - 通过 OO Prolog 中的多方法碰撞恒星物体?
我想知道如何在 Prolog 中结合统一和 OO。我想在术语对象上实现多方法调度。
如果没有术语对象和简单术语,我将执行以下操作,并且可以从多参数索引中受益:
但上面只给出了精确的类型匹配。
如果我想要一个子类类型匹配,我应该怎么做(可能还有更多的宇宙飞船子类,如 excelsior、galaxy 等。在案例 2,3 和 4 中也应该匹配)。
我还能使用统一和索引吗?
再见
PS:示例来自这里,它没有 Prolog 解决方案:
https ://en.wikipedia.org/wiki/Multiple_dispatch
c++ - 在类之外声明的方法的动态调度
我试图理解一个库实现,但一些方法动态链接的方式让我感到困惑。我知道使用派生类的对象时的调度机制,但是没有对象我不知道它是如何工作的。我想了解的库是来自 gcc的libitm 。
头文件libitm.h将所有 ABI 方法声明为顶级方法,它们周围没有类或结构。对于它们中的大多数,我找到了一个独特的定义,所以我对它们没有任何疑问,我在这里省略了它们。但是下面的摘录显示了 70 个方法的声明,这些定义让我感到困惑。
在文件dispatch.h中声明了一个结构体 abi_dispatch,它被用作特定 TM 算法调度的基础。在这个结构中,上面 70 个方法的声明都是纯虚方法。以下摘录显示了方法和结构的宏定义。
abi_dispatch 的派生结构可以在例如method-ml或method-gl中找到。他们使用 CREATE_DISPATCH_METHODS(virtual, ) 和上面的宏来生成 70 个读/写方法并将它们映射到加载/存储模板函数。
我的大问题是:运行时系统如何知道在调用库函数之一时应该使用哪个方法定义(method-gl 或 method-ml 中的那个)?在读/写方法的定义中,没有提到 abi_dispatch 对象。线程本地存储中存在一个 abi-dispatch 对象,但我不知道它如何适应这个。
感谢您的帮助。