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

c++ - Why do I get a segmentation fault when calling a virtual method in this code?

I'm still learning C++; I was trying out how polymorphism works and I got a segmentation fault when calling a virtual method.

(Note: I didn't mark the destructor as virtual, I was just trying out to see what happens.) Here's the code:

Also, if you've any other tips regarding the usage of inheritance and polymorphism in general for someone who knows these concepts in Java, please let me know. Thank you!

0 投票
2 回答
939 浏览

ruby - “混乱多态”反模式

在相当大的 Ruby 应用程序中,我们遇到给定对象由以下几项标识的情况:例如名称和 ID。这些值类型中的每一个都有不同的用途,因此并不完全等价(id 和 name 在不同的地方保留)。因此,我们最终会在应用程序中传递各种值(id、名称和对象)。这种情况至少在某种程度上似乎是一个问题,因为我们已经被错误所困扰,这些错误涉及不清楚应该将什么类型传递给给定函数。实际上,我记得这些年来在许多应用程序中看到过类似的问题代码,尽管我再也没有给它一个具体的名字。

Ruby 作为一种无类型语言,不像 C++ 那样允许经典的基于类型的多态函数。作为一种解决方法,一位同事经常使用这种代码:

这段代码围绕我们的代码库(不仅仅是初始化程序)的扩散导致了我所说的“混乱多态”。它通常有效,但有时会产生非常令人费解的情况。

我对此有三个问题。

  • 有没有正式的名称作为反模式?“混乱的接口?”,“混乱的多态性?” 或者是其他东西?
  • 人们认为这有多糟糕?
  • 有系统的方法来重构它吗?我们在普通重构中遇到的挑战是,我们创建的许多测试都使用这种松散类型,因此我们必须同时更改测试和实现,因此不会产生普通基于测试的重构的脚手架效应。我认为实际上可以“加强”这种松散的多态性,并将代码抽象为一个函数,而不是立即将其撕掉。但这会是个好主意吗?
0 投票
1 回答
928 浏览

ruby-on-rails - 多态关联不保存 ClassName(没有 STI),有什么提示吗?

我有两个模型,一个叫做 Notes,一个叫做 Comments。评论可以与许多其他模型相关联,因此我使用多态关联。在 schema.rb 中它看起来像这样:

当我想将评论保存到笔记时,一切似乎都有效:

奇怪的是,在评论表中它保存了 commentable_type = 0 而不是 = "Note" 应该是。如果我输入@note.comments,它仍然会找到评论。

我不明白这种行为。你有什么想法?

0 投票
4 回答
1916 浏览

c# - 对比 C# 泛型与 Haskell 参数化类型

根据我在 StackOverflow 上找到的一些建议,我正在研究 Haskell。我很高兴看到 Haskell 的参数化类型的行为与 C# 泛型非常相似。两种语言都建议使用单个字母作为类型参数(通常),并且两种语言似乎都遵循类似的过程来用实际类型替换类型参数。因此,我很快就理解了这个概念。

这导致了这一点:Haskell 的参数化类型与 C# 泛型类型有哪些不同?我从学习 Ruby 中知道,如果你认为从一种语言熟悉的概念在你刚接触的另一种语言中是相同的,你可能会遇到很大的麻烦。通常,当功能实际上非常相似时,问题会更糟……因为它们通常不是100% 相同的。那么,如果我假设我根据我对 C# 泛型的了解理解了参数化类型,那么我可能会被哪些“陷阱”所困扰?

谢谢。

0 投票
2 回答
2270 浏览

c# - 多态性问题 - 虚拟字段?(C#)

我的班级设计有问题。

我的游戏对象有核心类。在绘图时,我需要从对象中检索位置。不幸的是,对象被视为它的基类型,因此该位置不是从派生类中检索的,而是从其父类中检索的。将字段定义为虚拟可以解决我的问题,但这是不可能的:(。如何设计类模式来避免这个问题?

正在发生的事情的简单示例:

0 投票
2 回答
2425 浏览

c# - C# 多态再一次 - 虚拟属性

这次我遇到了虚拟字段的问题。

我的游戏对象有核心类。此类包含带有模型类对象的字段。模型的对象包含位置等值。

现在 - 在绘图时我需要从它的模型中读取每个对象的位置。当我使用派生而不是默认模型类时,问题就开始了。例子:

我试图将模型定义为虚拟属性而不是字段,但这失败了,因为派生属性必须与它们的基础类型相同。铸造是徒劳的,因为会有许多其他模型类型。如果我想从派生类而不是基类中读取值,我该怎么办?

0 投票
5 回答
2036 浏览

c# - 再次提出 C# 多态性问题 - 覆盖字段?

这次我遇到了虚拟字段的问题。

我的游戏对象有核心类。此类包含带有模型类对象的字段。模型的对象包含位置等值。

现在 - 在绘图时我需要从它的模型中读取每个对象的位置。当我使用派生而不是默认模型类时,问题就开始了。例子:

我试图将模型定义为虚拟属性而不是字段,但这失败了,因为派生属性必须与它们的基础类型相同。铸造是徒劳的,因为会有许多其他模型类型。如果我想从派生类而不是基类中读取值,我该怎么办?

我已经问过这个问题,但答案没有带来任何解决方案。解释:

  • 使用接口 IGameObjectModel

    概念很好,但我必须强制执行字段。接口不能定义字段,所以我必须定义属性。但是我不能做 IGameObjectModel.Position.X=10 因为 Position 不是一个字段。

  • 为了使 GenericGameObject 成为泛型类型,例如 GenericGameObject 和 Missile 派生自 GenericGameObject 的类型, 我无法将导弹投射到 GenericGameObject 并通常将这些对象存储在同一个列表中。当然,我可以制作这两个可以继承的主要基本类型,但是我将无法访问 Model 字段。

  • 使模型成为属性而不是字段。 无法更改派生类中的属性类型。

我能做什么?

0 投票
7 回答
14392 浏览

java - 超类不调用被覆盖的方法吗?

我有以下课程:

当我现在调用 bar.b() 时,我希望它调用 foo 中的重写方法 a()。但是,它确实打印“a”。

0 投票
8 回答
1757 浏览

c++ - 指针到指针不支持 C++ 多态性

我正在寻找一种正确的方法来清理我的指针。这里的示例代码:

但是编译器给出了错误:

0 投票
5 回答
2766 浏览

c++ - 从 Derived* 转换为 Base*&

我试图通过传递对指针的引用而不是指向指针的指针来回答这里提到的问题,如下所示:

但这会在第 32 行产生以下编译器错误:

错误 C2664:“RemoveObj”:无法将参数 1 从“子 *”转换为“父 *&”

我同意不允许从 Child** 转换为 Parent**。但是为什么也不允许这种转换呢?