我需要从一个抽象类和从它继承的几个类创建一个层次结构。每个类都有自己唯一的名称(field NAME
),用于在创建实例时初始化大量参数(为简单起见,我简单地将其替换为method printName
)。这个逻辑对所有类都是一样的,所以我需要把它移到抽象类的构造函数中。并且在创建一个新的具体类时,实现一个简单的字段或一个简单的方法就足够了(新的类可以由其他开发人员创建,您需要尽量减少他们的定制)。
abstract class AClass
{
protected abstract NAME:string;
constructor() {
this.printName();
}
private printName = () => {
console.log(this.NAME);
}
}
class ImpClassOne extends AClass
{
protected NAME: string = 'name1';
}
class ImpClassTwo extends AClass
{
protected NAME: string = 'name2';
}
const one = new ImpClassOne();
// Ожидаю в консоли 'name1'
const two = new ImpClassTwo();
// Ожидаю в консоли 'name2'
// В обоих случаях получаю 'undefined'
但新名字并没有被提起。首先处理抽象类的构造函数,它只使用它自己的字段实例NAME
(并且它是未定义的),然后才处理新类的构造函数(已经看到正确的名称,但是晚了,因为设置在超类中进行)。
问题是,如何从超类中的子类中获取覆盖的名称?或者,选择所有获得的调用的结构是什么?最主要的是,在创建新类时,应该有最少的设置。在其他语言中,我不记得有这样的问题,似乎超类立即将所有内容都拉了起来。我想到了“模板方法”模式,但你也不能从构造函数中调用抽象方法。提前致谢。