在TypeScript中扩展Singleton类

时间:2019-03-14 18:03:35

标签: typescript design-patterns

我正在尝试扩展和覆盖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>

1 个答案:

答案 0 :(得分:2)

由于Singleton将是ExtendedSingleton的原型,因此,每当您访问ExtendedSingleton上的任何静态属性时,它都会首先检查Singleton的属性。

这意味着如果首先在_instance上设置Singleton,则ExtendedSingleton._instance将返回该值。它以另一种顺序工作,因为如果ExtendedSingleton没有_instance字段,则它会在Singleton得到一个字段之前得到它自己的字段。

如果您将_instance设为私有而不是受保护(因为每个类都应该有自己的名字),Typescript会注意到此问题并给您带来错误。

解决此问题的一种方法是在一个或两个类中重命名_instance,以确保它们都具有自己的字段。