У меня есть два класса с одним и тем же интерфейсом, которые реализуют разные 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));
}
}
Интересно, если это хороший подход и есть ли другие способы сделать то же самое.