Расширение класса Singleton в TypeScript - PullRequest
1 голос
/ 14 марта 2019

Я пытаюсь расширить и переопределить метод в классе Singleton в TypeScript, вот код для Singleton Class:

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...');
    }
}

ExtendedSingleton Class:

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), или есть ли лучшее решение моей проблемы.

Примечание: Я исправил проблему, используя интерфейс и реализовав его в обоих классах, но это не будет эффективно в большом классе, где мне нужно переопределить один или два метода.

1 Ответ

2 голосов
/ 14 марта 2019

Поскольку Singleton будет прототипом ExtendedSingleton, при каждом обращении к статическим свойствам ExtendedSingleton сначала будет проверяться Singleton для этого свойства.

Это означает, что если _instance сначала установить на Singleton, то ExtendedSingleton._instance вернет это значение. Он работает в другом порядке, потому что если ExtendedSingleton не имеет поля _instance, оно получает свое собственное, прежде чем Singleton получает его.

Если вы сделаете _instance закрытым вместо защищенного (поскольку каждый класс должен иметь свой собственный в любом случае), Typescript замечает эту проблему и выдает ошибку.

Одним из способов решения этой проблемы является переименование _instance в одном или обоих классах, чтобы они оба получили свое поле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...