问题标签 [run-time-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 投票
0 回答
183 浏览

java - 如何使用 java 类变量等枚举实现运行时多态性?

我为客户的拖拉机开发了一个项目。现在我必须在该项目中为组合添加相同的功能。所以我添加了一个名为 Machine 的基类和两个子类TractorCombine扩展了Machine.

因此,除了一些基本更改之外,我的业务逻辑代码(即Machine类中的抽象方法名称)保持不变,并且代码对TractorCombine都适用。

我面临的唯一问题是,我有一个TractorConstant类,其中包含许多在整个项目中使用的枚举。

我想用这些枚举来实现运行时多态性,例如

MachineConstant类中的枚举

TractorConstant类中的枚举

和类CombineConstant中的枚举

我将MachineConstant在我的项目中有一个 ' 的引用,并且根据用户选择的机器类型,我将初始化该引用

例如MachineConstant machineConstant = new CombineConstant()

在代码中,我想调用machineConstant.getEnum195_AreMeterAlert()

但现在我得到Expression Expected了这条线的错误
return TractorConstant.Enum195_AreMeterAlert;

那么如何消除这个错误,枚举是否有可能实现这样的运行时多态呢?或者我与这些枚举还有什么关系?

0 投票
2 回答
4846 浏览

java - 为什么我不能将父类分配给子类类型的变量?

为什么子类的引用变量不能指向父类的对象?IE

但是我们可以反之亦然请用内存视图(堆)回答

0 投票
4 回答
506 浏览

java - 为什么我们不能使用超类的引用变量来访问其子类的方法(超类中不可用的方法)?

我知道,无论实际对象是什么,引用变量指的是什么,我可以在引用上调用的方法取决于变量的声明类型(在代码的第 15 行)。我想知道为什么.为什么类用户不能使用Shape类型的引用变量s来调用它的子类方法drawCircle()?

你能给我解释一下在对象级别发生了什么吗?我是java新手。

0 投票
1 回答
103 浏览

python - python中的多态性和字节码如何关联?

在 python 中,多态性是如何工作的?

在python中,如果我有一些功能,例如

然后根据dis.dis(f)python将其转换为描述以下循环的字节码指令:

  • 加载下一个常量值
  • x再次加载
  • 将它们相乘
  • 添加产品(在前面的项的累积上)

但是如果x是一个numpy数组或python类,而不是一个基本的数据类型,那么可能解释器必须做额外的工作(例如二进制乘法操作码必须以某种方式引导其他函数被调用,也许从一些属性查找开始,这通常对应于完全不同的操作码)。这似乎与普通汇编语言非常不同,在普通汇编语言中,简单的算术运算将是原子的(并且不会导致 CPU 也执行反汇编列表中不可见的额外指令)。

是否有关于 python 解释器如何操作的文档,以及在评估涉及多态性的表达式时它实际执行的步骤序列?(理想情况下,在一个较低的细节层次上,一个步进式 python 调试器会暴露什么?)

编辑:

为了支持多态性,算术运算还必须不仅涉及算术,还必须涉及类型检查、属性查找、条件跳转和函数调用。(所有这些东西都有自己的操作码。)cpython通过使算术操作码本身在解释器的一个步骤中执行许多复杂的操作来实现这一点是否正确(被调用函数中包含的指令除外),而不是通过一系列单独的操作码单步执行解释器来实现相同的结果(例如,LOAD_ATTR、CALL_FUNCTION 等)?

是否有任何文档,例如表格,用于所有操作码,描述每个操作码可能导致的所有操作?

0 投票
2 回答
90 浏览

java - 列表与 ArrayList

哪个更好,为什么?

一个)List<String> list = new ArrayList<>();

b)ArrayList<String> list = new ArrayList<>();

0 投票
0 回答
580 浏览

c++ - C++ - 静态多态与运行时多态与 Lambda

我了解了静态多态性和运行时多态性之间的区别,从那时起我就读了很多关于它的东西。另外,因为我发现实现了一个静态多态接口(以一种方式,一个类可以使用具有基类定义的对象,而不知道该对象是用什么“派生”类实例化的)。

所以我跑了一个小测试来比较这些不同的实现。

这是代码:

问题是,当我运行它时,虚拟实现是最快的,而静态多态应该更快。下面是一个执行结果示例:

虚拟执行时间:53 ms
lambda 执行时间:94 ms
模板执行时间:162 ms

我猜这是因为一些编译器优化。我用 gcc 6.3.0 编译。

我的问题是:为什么模板实现最慢?真的是因为编译器的优化吗?如果是,它们是什么,我怎样才能改变我的测试以获得“真正的”运行时间?如果没有,我做错了什么?

0 投票
1 回答
22 浏览

c++ - 不同种类的多态性问题

从我目前学到的知识来看,有两种多态性,编译时和运行时。在编译时,多态函数或运算符由编译器解析,而在运行时,它在运行时解析。编译时多态性的示例包括函数和运算符重载,运行时多态性包括函数覆盖和虚函数。此外,还有像早期绑定和晚期绑定这样的情况,我稍后会谈到。考虑以下代码:

如果我这样做:

结果很明显:

当我使用指向基类的指针来操作这些函数时,真正的问题就开始了。

输出将是:

这是由于早期绑定,编译器检查调用函数的对象类型,而不是其处理的对象类型。很明显它是在编译时完成的。现在,如果我virtual在基类函数定义中使用关键字,那么我可以轻松地完成上述操作,这是由于后期绑定,它根据对象的类型为运行时保存了函数定义。这是运行时多态的一个例子。

抱歉花了太长时间,我的问题是,这是我们实现运行时多态性的唯一方法吗?此外,如果函数覆盖是运行时多态,那么前面的示例(即具有早期绑定的例子)也应该是运行时多态,因为它也在执行函数覆盖。

0 投票
1 回答
74 浏览

oop - 向下转换运行时多态吗?

OOPS 中的向上转换通过覆盖父类和子类的方法使运行时多态成为可能。OOPS 中的向下转换也可以以任何方式运行时多态吗?

0 投票
5 回答
767 浏览

java - 方法覆盖总是运行时多态性吗?

运行时多态性是否总是在方法覆盖时发生,或者仅在方法覆盖期间将子类对象分配给超类变量后调用方法时才会发生?

0 投票
2 回答
81 浏览

java - 如何知道它是编译时多态还是运行时多态?

考虑一个超类:

它是子类:

我按照以下方式确定语句 1,2 和 3 是编译时多态还是运行时多态:

  • 编译器首先确定调用语句中使用的引用变量的类类型,然后编译器检查源代码中是否存在此基的派生类以及调用语句中使用的方法是否在派生类中被覆盖. 如果找到派生类并且它包含函数的重写版本,则在运行时确定引用变量所引用的对象的类型,并执行该类的类型函数(运行时多态性),否则类中存在函数(引用变量所属的)被执行(编译时多态性)。

  • 通过这种方式: 1) 语句 1 将导致运行时多态性。

    2)语句2也会导致运行时多态性。

    3)语句3会导致编译时多态。

问题1:我想知道这种做法是对还是错?

问题 2:当使用返回对象地址的函数调用语句代替引用变量时,过程会是什么?我认为返回地址的函数的返回类型将用于确定多态的类型。我对么?