Можно ли вообще создать экземпляр типа класса JS из унаследованного фабричного метода?

Итак, я гуглю это уже несколько часов и не могу решить, возможно это или нет. Я недостаточно хорошо понимаю наследование JS, чтобы найти решение. Я работаю в TypeScript, но я думаю, что это проблема JavaScript. Платформа — Node.js.

Моя установка следующая:

class Message {
    static fromBytes(bytes) {
        someChecks();
        return new Message(processedBytes);
    }
    constructor(someParameters) {
        someOtherChecks();
    }
}

class SpecificMessage extends Message {
    constructor(parameters) {
        someSpecificChecks(parameters);
    }
}

Предыстория заключается в том, что я получаю несколько байтов сетевого трафика и должен проверять согласованность перед его декодированием. Классы также используются для подготовки новых исходящих байтов (есть метод toBytes), поэтому в fromBytes проверяется непротиворечивость контрольной суммы, а в конструкторе — логическая непротиворечивость.

Я хотел бы иметь наследуемый фабричный метод, который будет возвращать соответствующий тип объекта. Вызов SpecificMessage.fromBytes вернет объект Message, поскольку он явно назван. Я хотел бы заменить создание этого объекта чем-то, что «знает», звоню ли я из Message или SpecificMessage. Мое лучшее предположение в этом направлении - что-то вроде Object.create(this.prototype, {someInitLiteral}), но я думаю, что это не вызывает конструктор?

Еще одна вещь, которая возникла, была Object.call(this, parameters), но я тоже не думаю, что это правильно. Есть ли способ создать экземпляр текущего класса из «общего» статического метода?

В худшем случае я думал просто вызвать super.fromBytes и создать новый SpecificMessage из содержащихся данных. Это создаст два объекта, но пройдет все проверки.

Спасибо за вашу помощь.


person Randelung    schedule 30.01.2019    source источник


Ответы (1)