【发布时间】:2021-11-26 07:43:46
【问题描述】:
我在构造函数中调用一个函数,我想在通过父构造函数进行的函数调用中使用子变量。出于演示目的,我创建了一个小脚本来展示我想要做什么:
class A{
intVal = 1;
constructor() {
this.identifyClass();
}
identifyClass()
{
console.log("I am class A", this.intVal); // This should be the value that B has overwitten
}
}
class B extends A
{
intVal = 2;
}
const x = new B();
所以我希望父构造函数中的函数应该使用被 B 覆盖的值,即。 intVal = 2 但目前它使用原始值。我可以为此使用任何解决方法,这样我就不必在 B 中创建构造函数然后在那里调用函数吗?
注意:这是一个非常复杂的应用程序,我不希望对在很多地方使用的 A 进行重大更改,并且 B 类公开,所以我不希望使用 B 类的人在可能的情况下更改当前他们只是覆盖实例变量的任何内容
【问题讨论】:
-
如果您不希望他们更改
A、B中的任何内容并且该变量是私有成员,则无法使其工作。这就是 OOP 封装概念存在的确切原因,因此没有人可以篡改它。如果您发布您尝试实现的实际场景,可能会有其他解决方案。如果变量是公共成员,为什么不直接在创建B之后修改它,然后使用x = B();然后x.intVal=something?。 -
我想我可以实现 Dave 的建议。我更新了描述我可以修改 A 但不想引入任何重大更改所以使用 getter, setter 我想我会很好地实现目标。
-
我认为你是对的@brainlesscoder 我试过但我怀疑在不改变 B 的使用方式的情况下是否可以实现。由于 B 在很多地方都被使用,并且可能会破坏我们的应用程序,所以我会避免更改它。
-
听起来您正在向 B 和现有代码库添加新功能。如果您有足够的时间,我建议您在代码周围添加带有边缘案例的单元测试,然后重构它。从长远来看,将为您节省很多。
-
是的,我已经对公共共享包进行了单元测试,我计划在其中引入上面所需的更改,但我认为如果不更改 B 的使用,目前是不可能的,所以如果我们可以避免或引入变化。
标签: javascript typescript class oop inheritance