【问题标题】:Use overwritten value in parent constructor在父构造函数中使用覆盖的值
【发布时间】: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 类的人在可能的情况下更改当前他们只是覆盖实例变量的任何内容

【问题讨论】:

  • 如果您不希望他们更改 AB 中的任何内容并且该变量是私有成员,则无法使其工作。这就是 OOP 封装概念存在的确切原因,因此没有人可以篡改它。如果您发布您尝试实现的实际场景,可能会有其他解决方案。如果变量是公共成员,为什么不直接在创建B 之后修改它,然后使用x = B(); 然后x.intVal=something?。
  • 我想我可以实现 Dave 的建议。我更新了描述我可以修改 A 但不想引入任何重大更改所以使用 getter, setter 我想我会很好地实现目标。
  • 我认为你是对的@brainlesscoder 我试过但我怀疑在不改变 B 的使用方式的情况下是否可以实现。由于 B 在很多地方都被使用,并且可能会破坏我们的应用程序,所以我会避免更改它。
  • 听起来您正在向 B 和现有代码库添加新功能。如果您有足够的时间,我建议您在代码周围添加带有边缘案例的单元测试,然后重构它。从长远来看,将为您节省很多。
  • 是的,我已经对公共共享包进行了单元测试,我计划在其中引入上面所需的更改,但我认为如果不更改 B 的使用,目前是不可能的,所以如果我们可以避免或引入变化。

标签: javascript typescript class oop inheritance


【解决方案1】:

好的,我想我明白了。我们创建一个symbol,如果传递给构造函数的最后一个参数不是符号,那么我们创建一个新对象,使用this.constructor,传入原始参数,加上符号,然后然后 致电identify。这有效地将identify 的调用与构造函数分开,允许我们从子类中获取this.intVal,同时对子类的用户仍然是透明的。

const _sym = Symbol();

class A {
     intVal = 1;
     constructor() {
         const args = Array.from(arguments);
         const _ = args[args.length - 1];
         if (_ !== _sym) {
             args.push(_sym);
             const el = new this.constructor(...args);
             el.identify();
             return el;
         }
     }
     
     identify() {
         console.log(this.intVal);
     }
}

class B extends A {
    intVal = 2;
}


const x = new A();
const y = new B();

【讨论】:

  • 试过了,但我认为对于上述两个建议,我需要更改 B 在第一种情况下的使用方式,我将不得不使用静态变量,而在第二种情况下使用 getter、setter。我现在想避免更改 B。
猜你喜欢
  • 1970-01-01
  • 2011-05-14
  • 2017-09-30
  • 1970-01-01
  • 2014-06-09
  • 2014-01-31
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多