我正在尝试扩展和覆盖TypeScript中的Singleton类中的方法,这是 Singleton类的代码:
class Singleton {
protected static _instance: Singleton;
protected constructor() { }
public static get instance() {
if (Singleton._instance === undefined) {
Singleton._instance = new Singleton();
}
return Singleton._instance;
}
public doWork() {
console.log('doing work in singleton...');
}
}
扩展单班:
class ExtendedSingleton extends Singleton {
protected static _instance: ExtendedSingleton;
protected constructor() {
super();
}
public static get instance() {
console.log('Creating Extended Singleton');
if (ExtendedSingleton._instance === undefined) {
ExtendedSingleton._instance = new ExtendedSingleton();
}
return ExtendedSingleton._instance;
}
public doWork() {
console.log('doing work in extended singleton...');
}
}
最后运行两个类的代码:
Singleton.instance.doWork();
ExtendedSingleton.instance.doWork();
问题在于两个日志“正在单例中工作...” ,并且当我交换线路时,此问题已解决。 我不知道为什么会发生这种行为(我认为这主要是我不了解javascript的继承方式的事情),或者是否有更好的解决方案来解决我的问题。
注意:我通过使用接口并在两个类中都实现了该问题,但是在只需要覆盖一个或两个方法的大型类中,这种方法无效。 / p>
答案 0 :(得分:2)
由于Singleton
将是ExtendedSingleton
的原型,因此,每当您访问ExtendedSingleton
上的任何静态属性时,它都会首先检查Singleton
的属性。
这意味着如果首先在_instance
上设置Singleton
,则ExtendedSingleton._instance
将返回该值。它以另一种顺序工作,因为如果ExtendedSingleton
没有_instance
字段,则它会在Singleton
得到一个字段之前得到它自己的字段。
如果您将_instance
设为私有而不是受保护(因为每个类都应该有自己的名字),Typescript会注意到此问题并给您带来错误。
解决此问题的一种方法是在一个或两个类中重命名_instance
,以确保它们都具有自己的字段。