gpt4 book ai didi

class - 如何处理类内部的多态性

转载 作者:行者123 更新时间:2023-12-02 03:42:33 24 4
gpt4 key购买 nike

在具有动态类型的语言中,多态性的使用可能会触发父类(super class)的错误。

我将尝试用一个简单的例子来解释我的问题:假设一种具有动态类型的语言(如 ECMAScript)和以下类结构:

diagram

class A{
private idA;
public A(){
idA=0;
}
public foo(){
update();
if (this.idA!=3) Throws new Exception(" What is happening? ");
}
private update(){
this.idA = 3;
}
}
class B extends A{
private idB;
public B(){
super();
idB=0;
}
public foo(){
super.foo();
// Any operation between A::update and B::update()
if (this.idB!=0) Throws new Exception("hmmm, that could not happend!");
update();
}
private update(){
this.idB = 5;
}
}

在这个非常简单的示例中,当我创建 B 类的对象时,B::foo() 调用父级 A::foo(),后者调用“update”。该对象是B的实例,因此调用的“更新”函数是B::update,之后,在B::foo中,再次调用更新函数(B::update)。最终结果是 A::update 从未被调用,并且 idA 仍然为 0。

A类单独使用时工作正常,但用B扩展它后,函数foo()失败。

此问题的正确解决方案是什么:

1) 强制类 A 调用 A::update ,这意味着每次调用他自己的函数时都会出现丑陋的代码(保护父类(super class)):

A::foo(){
A::update();
if (this.idA!=3) Throws new Exception(" What is happening? ");
}

2) B::update是A::update的扩展,所以B::update必须调用自己的父函数(准备子类,处理问题):

B::foo(){
super.foo();
... // Any operation that must be performed between A::update and B::update
}
B::update(){
super.update();
this.idB = 5;
}

但在本例中是 A::foo 调用 update,而不是 B::foo。这意味着其他问题。

3)任何其他解决方案。

总结:

如何保护父类(super class)代码免受多态性影响?

  • 向父类(super class)添加保护。
  • 创建子类来处理这些问题
  • 语言必须做到这一点! (不知道动态类型语言是否可以)

我正在寻找这个问题的非常理论/规范的解决方案。

已编辑:将问题从构造函数中解决出来并澄清一些要点。

最佳答案

从构造函数中调用实例方法,尤其是虚拟实例方法,通常被认为是一种非常糟糕的做法 出于这个原因(也是因为该对象尚未完成“初始化”)。

3) Any other solution.

医生,我这样做的时候会很痛。

那就不要这样做!

说真的,如果你需要在A的构造函数中设置IdA,不要通过调用update来完成,而是通过显式A 的构造函数中设置 IdA 的值。

关于class - 如何处理类内部的多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18064182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com