Как проверить, переопределен ли дочерний класс родительским методом / функцией? - PullRequest
3 голосов
/ 03 мая 2019

Я издеваюсь над классом интерфейса:

const error = "Child must implement method";

class MyInterface
{
  normalFunction()
  {
    throw error;
  }

  async asyncFunction()
  {
    return new Promise(() => Promise.reject(error));
  }
}

class MyImplementation extends MyInterface
{
}

Если какой-либо из методов интерфейса вызывается без переопределенной реализации, выдается ошибка.Однако эти ошибки будут появляться только во время выполнения.

Есть ли способ проверить, что функции были переопределены при построении?

Ответы [ 2 ]

2 голосов
/ 03 мая 2019

Вы можете добавить некоторые проверки в конструктор MyInterface, например:

class MyInterface {
    constructor() {
        const proto = Object.getPrototypeOf(this);
        const superProto = MyInterface.prototype;
        const missing = Object.getOwnPropertyNames(superProto).find(name =>
            typeof superProto[name] === "function" && !proto.hasOwnProperty(name)
        );
        if (missing) throw new TypeError(`${this.constructor.name} needs to implement ${missing}`);
    }

    normalFunction() {}

    async asyncFunction() {}
}

class MyImplementation extends MyInterface {}

// Trigger the error:
new MyImplementation();

Обратите внимание, что все еще есть способы создания экземпляра MyImplementation без запуска конструктора:

Object.create(MyImplementation.prototype)
0 голосов
/ 03 мая 2019

Разве вы не можете использовать отражение, чтобы перечислить все функции класса?

Например, здесь https://stackoverflow.com/a/31055217/10691359 дают нам функцию, которая перечисляет все функции объекта. Как только вы получите все из них, вы можете увидеть, есть ли у вас переопределенная функция.

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