Нет сомнений в том, что шаблон декоратора является хорошим и простым стандартом для улучшения некоторого метода в классе, который не может (или не должен) наследовать метод со старым методом, как в этом примере в C # (я не использую интерфейс (я следует) сделать его как можно короче).
using System;
class Human { ... }
class Father {
public string Info() {
return "John";
}
}
class Son : Human { // decorating Father
Father f = new Father();
public string Info() {
return "I am son of "+f.Info();
}
}
class Program {
public static void Main() {
Son s = new Son();
Console.WriteLine(s.Info()); // I am son of John
Console.ReadKey();
}
}
Но так как у нас есть множественное наследование в C ++, мы можем скрыть информацию отцов () вместо того, чтобы украшать ее:
#include <string>
#include <iostream>
using namespace std;
class Human { ... };
class Father {
public:
string Info() {
return "John";
}
};
class Son : public Human, Father { // inherit both
public:
string Info() {
return "I am son of " + Father::Info();
}
};
int main() {
Son* s = new Son();
cout << s->Info(); // I am son of John
cin.get();
return 0;
}
Я понимаю, что причина многих шаблонов состоит в том, чтобы переместить специальную логику из класса многократного использования в специальный класс, поэтому повторно используемый класс не должен (или не может быть) испорчен со специальным кодом , Но и этого можно достичь с помощью множественного наследования.
Так вы можете объяснить (или привести пример), где декорирование - лучшая идея, чем множественное наследование?