Правильный способ, чтобы два класса содержали общий код - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть два класса с одним и тем же интерфейсом, которые реализуют разные API.

class RawAPI_1 {
    constructor(options) {
        this.options = options;
    }

    foo() {
        console.log('foo1')
    }
}

class RawAPI_2 {
    constructor(options) {
        this.options = options;
    }

    foo() {
        console.log('foo2')
    }
}

Теперь мне нужно расширить эти классы методами, обернутыми поверх существующих (необработанных) методов API, чтобы создавать классы "Extended API".Эти расширенные методы API одинаковы для обоих классов - они просто вызывают методы из RawAPI_1 и RawAPI_2 соответственно.Другими словами, мне нужно иметь два класса ExtendedAPI_1 и ExtendedAPI_2, которые будут иметь метод bar(), подобный следующему:

    bar() {
        console.log('Extended');
        this.foo()
    }

Если метод bar() вызывается на экземпляре ExtendedAPI_1,он должен вызывать foo() из RawAPI_1 и, если он вызывается из ExtendedAPI_2 экземпляра, он должен вызывать foo() из RawAPI_2.

Я пришел к следующему решению:

class ExtendedAPI{
    constructor(raw_api) {
        this.raw_api = raw_api;
    }

    bar() {
        console.log('extended');
        this.raw_api.foo();
    }
}

class Extended_API_1 extends ExtendedAPI{
    constructor(options) {
        super(new RawAPI_1(options));
    }
}

class Extended_API_2 extends ExtendedAPI{
    constructor(options) {
        super(new RawAPI_2(options));
    }
}

Интересно, если это хороший подход и есть ли другие способы сделать то же самое.

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