问题标签 [polymorphism]

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 投票
2 回答
654 浏览

ruby-on-rails - 如何使用多态关联创建评论

我有三个模型都可以有评论,每个评论必须属于一个用户。我正在使用多态关联 :as => :reviewable 但我不确定我应该把为每个模型创建评论的逻辑放在哪里。我会假设每个评论的 CRUD 应该由 reviews_controller 处理(或嵌套属性?在其他控制器中?),但是我如何将评论与每个模型相关联?

我在谷歌上找不到任何模型/视图/控制器的例子,也许这对清理事情有很大帮助。

谢谢, 塞萨尔

0 投票
3 回答
10482 浏览

c++ - C++成员函数虚覆盖和同时重载

如果我有这样的代码:

我收到一条错误消息,提示我正在尝试进行从 int 到 void* 的无效转换。为什么编译器不能弄清楚他必须调用 B::f,因为这两个函数都被声明为虚拟函数?


在阅读了 jalf 的答案后,我进一步减少了它。这个也不行。不是很直观。

0 投票
6 回答
3584 浏览

java - 重载超类的方法

我正在为 RTS 游戏构建 AI。(对于Spring RTS 引擎,如果有人感兴趣的话。)我设置它的方式主要由一组组件组成,这些组件通过触发的事件进行通信。每个组件都有一个方法 handleEvent(Event) 来接收其他组件触发的事件。

事件是一个接口。存在一个层次结构,每个子类都提供有关它们所代表的事件的更详细信息,可以使用特定于该类的 getter 方法来访问这些信息。例如,UnitGainedEvent 类实现了 Event 接口。这个类有一个子类 UnitFinishedEvent(对于任何好奇的人来说,它表示一个单元或建筑物的建造已经完成。)

不是每个组件都会对所有事件感兴趣,所以我想让组件简单地选择他们感兴趣的事件并只接收这些事件。此外,可能的事件集是可扩展的,因此让组件为每种事件类型指定方法不是一个有效的选项。最初我认为访问者模式可能会帮助我解决这个问题,但它失败了,因为它还需要一组固定的事件类型。(我不是 100% 确定我正确理解了模式。如果我错了,请纠正我。)

到目前为止,我发现的唯一解决方案是实现每个组件的 handleEvent(Event) 方法,如下所示:

但是,我真的不喜欢将事件强制转换为特定的 Event 类。现在,记住方法重载可用于根据参数的运行时类型调用不同的方法,我很快想出了一个绝妙的解决方案,既简单又优雅:我可以创建一个带有空实现的基类 handleEvent(事件),并且简单地让子类通过创建方法handleEvent(UnitGainedEvent unitGainedEvent)来接收他们感兴趣的事件,例如。为了确保它可以工作,我设置了一个快速测试用例:

令我非常满意的是,这段代码实际上打印了“Handling UnitGainedEvent”。于是我着手实施。

我的 Component 基类看起来像这样:(嗯,不是真的。这是 Component 类剥离了与我想演示的问题无关的所有内容。)

这是一个子类的例子:

为了测试设置,我使用以下主类:

所以我运行了代码,令我惊讶的是,结果是一个打印整齐的“处理事件”。有趣的是,如果我将组件变量的类型更改为 SomeComponent,它打印出“Handling UnitGainedEvent”。由于某种原因,系统会盲目地调用 Component 类的 handleEvent(Event) 方法,而不是重载 SomeComponent 的 handleEvent(UnitGainedEvent)。(我很想听听 Sun 在这背后的推理,认为这与我的问题并不真正相关 - 不像他们会仅仅因为少数人会发现它是一个非常有用的功能而修复它。)

淘网告诉我其他人也遇到了同样的问题。从我找到的微不足道的信息来看,很少有人,但仍然有人,尽管我发现有关一般方法重载和覆盖的信息比我想知道的要多。但是,最后,我找不到解决方案。

现在,我的(相当明显的)问题是,有没有办法解决这个问题?如果做不到这一点,谁能想到或帮我找到另一个同样方便的解决方案?

编辑:我简直不敢相信我在十分钟后就有了答案。我很惊喜。:) 但是,到目前为止,大多数答案都以一种或另一种形式表明我为每种可能的事件类型制作了一种单独的方法。从技术上讲这是可能的,但这需要我回到代码中并在每次有人提出新的事件类型时添加一个新方法。我学到的是糟糕的编码实践。(另外,我已经有大约 20 多种事件类型,但我什至还没有完成。)相反,我宁愿使用涉及强制转换的解决方案,如上所述。至少这样我可以确保未知的事件类型被简单地忽略,让我可以自由地只处理那些我想使用它们的事件。然而,我真的希望有一个结合了两者优点的解决方案。没有铸造,

非常感谢,Loid Thanead

0 投票
1 回答
897 浏览

ruby - 多态 has_many 自引用

我有许多模型(文章、视频、照片)

现在我正在尝试创建一个related_to 关联,这样

一篇文章可以有许多与之相关的其他文章、视频和照片。视频和照片也可以。

这是我尝试过的:

模块 ActsAsRelatable

结尾

类 RelatedItem < ActiveRecord::Base belongs_to :source, :polymorphic => true belongs_to :related, :polymorphic => true end

然后我在我的三个模型(文章、视频、照片)中添加了acts_as_relatable,并将该模块包含在 ActiveRecord::Base 中

在 ./script/console 中尝试时,我让它添加相关项目并且 id 可以正常工作,但是 source_type 和 related_type 始终相同(从中调用related_items 的对象)我希望related_item 是另一个模型名称。

有什么想法吗?

0 投票
6 回答
1879 浏览

language-agnostic - 我应该使用像 IEnumerable 这样的接口,还是像 List<> 这样的具体类

我最近在别处*表达了我对此的看法,但我认为它值得进一步分析,所以我将其作为自己的问题发布。

假设我需要在我的程序中创建和传递一个容器。至少在现阶段,我可能对一种容器与另一种容器没有强烈的看法,但我确实选择了一个;为了争论,假设我将使用List<>

问题是:编写我的方法来接受和返回高级接口(例如 C# 的IEnumerable )是否更好?或者我应该编写方法来获取和传递我选择的特定容器类。

我应该寻找哪些因素和标准来决定?哪种程序可以从其中一种或另一种中受益?计算机语言会影响您的决定吗?表现?程序规模?个人风格?

(这还重要吗?)

**(作业:找到它。但请在寻找我自己的答案之前在这里发布您的答案,以免偏见您。)*

0 投票
4 回答
657 浏览

c# - C#。为遗留代码添加多态性

假设我们有不能修改的遗留类:

我想用这样的签名写一个助手:

请注意,第一个参数的类型是“对象”。测试代码应该是这样的:

问题是,除了这些之外,您还可以想象什么实现:

谢谢!

0 投票
5 回答
2166 浏览

c++ - C++ 概念检查与继承

使用虚函数和 C++ 继承机制与使用模板和类似 boost 概念之间的关系是什么?

似乎有很多可能的重叠。也就是说,似乎有可能用任何一种方法来实现多态行为。那么,什么时候偏爱一个比另一个有意义呢?

我提出这个的原因是因为我有一个模板化的容器,其中容器本身具有层次关系。我想编写使用这些容器的算法,而不关心它是哪个特定容器。此外,某些算法将受益于知道模板类型满足某些概念(例如,可比较)。

因此,一方面,我希望容器具有多态性。另一方面,如果我想正确实现一些算法,我仍然必须使用概念。初级开发人员应该做什么?

0 投票
2 回答
82098 浏览

c++ - C++中的纯虚析构函数

写错了吗:

对于抽象基类?

至少在 MSVC 中编译...它会在运行时崩溃吗?

0 投票
4 回答
569 浏览

generics - 并行继承链中的多态性和类型安全

我有两个并行的继承链:

我想在 Animal 上实现“Eats”多态属性。这是它的样子:

但是,此代码不是类型安全的。如果我用草喂我的狮子,我只会在运行时遇到我的错误。

有人可以为我提供一个代码示例,在不牺牲多态性的情况下使用泛型促进类型安全吗?

0 投票
4 回答
984 浏览

c# - 设计问题:获取子对象类型信息,避免表示层中的 if 语句

我有一个这样的客户层次结构:

当我检索客户时,我想在 Web 表单上显示要编辑/修改的属性。目前,我使用 if 语句来查找子客户类型并显示专门的属性。是否有设计模式(访问者?)或更好的方法,以便我可以避免表示层中的“if”语句?你怎么做呢?

更多信息:这是一个带有 nHibernate 后端的 asp.net 网站。每个客户类型在页面上都有自己的用户控件,我想根据客户类型自动加载。