Композиция является полезной альтернативой наследованию, когда кто-то хочет каскадно вызывать методы от дочернего к родительскому, см. метод расширенного класса дочернего элемента вызывает свою супер версию, но он все еще видит только дочерние данные
Однако, чтобы дочерний элемент представлял интерфейс, совместимый с родительским типом, необходимо реализовать потенциально большое количество методов-заглушек, которые имеют одинаковую форму, а именно они просто передают вызов предыдущему родительскому элементу (который сейчас компонент).
Мой вопрос здесь, возможно ли написать метод всеобъемлющего анализа? Метод catch-all вызывается, когда не вызывается ни один из других методов. Тогда всеохватывающее устройство будет просто передавать вызовы родительскому компоненту. Таким образом, заглушка должна быть написана только один раз. Вариации могут быть использованы для сортировки множественного наследования и т. Д.
Примерно так:
class A {
constructor(){
this.x = "super x!";
}
f(){
console.log("I am a super f()!");
}
logx(){
this.f();
console.log(this.x);
}
}
class B {
constructor(){
this.a = new A();
this.x = "derived x.";
}
f(){
console.log("I am a derived f()");
}
logx(){
this.a.logx();
}
}
let b = new B;
b.logx();
I am a super f()!
super x!
Гипотетически вместо этого будет что-то вроде этого:
class A {
constructor(){
this.x = "super x!";
}
f(){
console.log("I am a super f()!");
}
logx(){
this.f();
console.log(this.x);
}
}
class B {
constructor(){
this.a = new A();
this.x = "derived x.";
}
f(){
console.log("I am a derived f()");
}
catch_all(method_name, ...args){
this.a.method_name(...args);
}
}
let b = new B;
b.logx();
I am a super f()!
super x!