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

php - PHP中看起来像多态的东西真的是多态吗?

试图弄清楚 PHP 是否支持方法重载、继承和多态等特性,我发现:

  • 它不支持方法重载
  • 它确实支持继承

但我不确定多态性。我发现这个谷歌搜索互联网:

我应该注意到,在 PHP 中,多态性并不是它应该的样子。我的意思是它确实有效,但由于我们的数据类型很弱,所以它不正确。

那么它真的是多态性吗?

编辑 只是不能在PHP supports polymorphism. 我不愿意说:“PHP 不支持多态性”,而实际上它确实支持。或相反亦然。

0 投票
5 回答
2601 浏览

c++ - 检查多态性中的实变量类型(C++)

假设我们有一个类 A 和类 B 和 C 继承自它。然后我们创建一个对 A 的引用数组,并用 B 和 C 填充它。现在我们决定要消除所有的 C。有没有一种方法可以检查数组的每个字段真正拥有的类型,而无需执行诸如 returnType() 函数之类的冗余操作?

编辑:将“A 的数组”固定为“A 的引用数组”。

0 投票
7 回答
16765 浏览

c# - 如何在基类对象上调用子类方法?

我正在使用一个为我生成一堆类的库。

这些类都继承自一个公共基类,但该基类没有定义所有子类共有的几个方法。

例如:

不幸的是,基类没有这些方法。这会很棒:

由于我的 A+B 对象有一个公共基类,而 Item 对象有一个公共基类,我希望能从多态的美妙世界中受益。

不幸的是,因为通用方法实际上并不存在于基类中,所以我不能虚拟地调用它们。例如,这将是完美的:

显然铸造会起作用,但我需要知道我拥有哪种类型会否定这些好处。

如何“强制”调用这些方法?我不担心得到一个不实现我试图调用的方法的对象。我实际上可以在 VB 中做我想做的事——我没有得到智能感知,但编译器很高兴并且它可以工作:

同样,我无法控制这些类(我认为排除了部分类)。

0 投票
7 回答
3270 浏览

java - Java:更快的重载或 if/else

我有子类,每个类与其他成员一起携带不同类型的值。可能有 LongObject、IntObject、StringObject 等。

会给我一个值,可以是long、int、string等,我要分别创建一个LongObject、IntObject、StringObject等。

重载如下所示的方法会更快(a)还是只使用如下所示的 elseif (b)?

这可能不是明显的性能差异。无论如何,重载方法可能以与 if/else 类似的方式实现。我不知道。

我也可以听到你们中的一些人说只是测试它。当然,我应该这样做。如果有人知道的话,我还想知道如何在后台处理这种类型的重载。

请让我知道你的想法。

谢谢,jbu

一个)

b)

编辑:我想我没有完全添加所有细节,你们中的一些人抓住了它。对于这两种选择,我仍然必须获取一个对象/值,并根据该值确定它是什么类型。因此,我仍然必须做某种 if/else 才能使用重载方法。

0 投票
3 回答
721 浏览

java - 为什么派生类有时只能在重写方法中具有专门的类型?

假设我有这个基类:

令我惊讶的是,我可以在派生类中做到这一点:

但我不能这样做:

这里发生了什么?为什么我可以使用专门的返回类型而不是专门的参数类型?

更令人困惑的是,如果我保留 的原始声明load,我可以将其分配给更特殊的类型:

0 投票
6 回答
4463 浏览

java - 强制调用基类方法

以下代码在运行时显然会打印出“B1/A2/B2”。现在,是否可以改为打印“A1/A2/B2”(即 A#method2() 应该在 A 上调用 method1(),而不是在 B 上)?

注意:我不需要通过多态性,这个问题只是出于好奇。

0 投票
4 回答
932 浏览

java - 如何实例化具有需要接口对象的构造函数的类

我正在尝试使用 Interactive Brokers Java API 来查看是否可以进行一些算法交易(最初是在纸上)。我想调用一个名为的方法ReqMktDepth(),该方法位于一个名为EClientSocket.

EClientSocket构造函数需要AnyWrapper传递一个类型的对象,并且是AnyWrapper一个接口而不是一个具体的类。从理论上讲,我该如何将一个AnyWrapper类传递给EClientSocket构造函数。

0 投票
4 回答
1512 浏览

c# - C#4 会允许“动态转换”吗?如果没有,C# 是否应该支持它?

我并不是指将较低的接口或基类转换为更派生的类的意义上的动态转换,我的意思是采用我创建的接口定义,然后动态地向该接口转换不是从该接口派生的不同对象接口但支持所有调用。

例如,

对于已知类型,这可以在编译时实现,对于使用动态声明的实例,可以在运行时实现。接口定义是已知的,类型也是已知的(在本例中),因此编译器可以确定对象是否支持接口定义的调用,并为我们执行一些魔术来进行强制转换。

我的猜测是这在 C#4 中不受支持(我无法找到对它的引用),但我想确定。如果不是,我想讨论它是否应该包含在语言的未来变体中,以及支持和反对的原因。对我来说,这似乎是一个很好的补充,可以在代码中实现更大的多态性,而无需创建全新的类型来包装现有的框架类型。

更新
以免有人指责我抄袭,我不知道Jon Skeet 已经提出了这个。然而,很高兴知道我们想到了非常相似的语法,这表明它至少可能是直观的。与此同时,“有一个原创的想法”在我的遗愿清单上又保留了一天。

0 投票
6 回答
2549 浏览

c++ - 为什么派生类不能在数组中工作?(C++)

我创建了一个名为 vir 的类,带有一个函数 move:

(它派生自一个具有变量 int x、int y 和 char sym 的类)我从中派生了一个类,称为 subvir:

然后我创建了一个 vir 数组,并将一个 subvir 放入其中

但是当我尝试使用 sv1.move() 时:

vir_RA[0].move();

它使用 vir move ({}) 而不是 subvir move ({x++})。我尝试将 sv1 设为 vir,将 vir_RA 设为 vir,它可以工作,当我将它们都设为 subvir 时它也可以工作,但我需要它们不同。我尝试将 vir::move() 设为纯虚拟,但随后我得到一个错误来证实数组。有谁知道当我从数组中使用 move() 时如何让它工作?

0 投票
10 回答
81464 浏览

java - 从子类访问父类的私有实例变量?

假设我们有一个foo具有私有实例变量的类bar

现在让我们有另一个类,baz,其中extends foo。如果没有定义访问器方法,baz可以访问foo变量中的非静态方法吗?barfoo

顺便说一句,我正在使用 Java。