Должны ли мы использовать шаблон декоратора в C ++? - PullRequest
0 голосов
/ 22 февраля 2012

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

Я понимаю, что причина многих шаблонов состоит в том, чтобы переместить специальную логику из класса многократного использования в специальный класс, поэтому повторно используемый класс не должен (или не может быть) испорчен со специальным кодом , Но и этого можно достичь с помощью множественного наследования.

Так вы можете объяснить (или привести пример), где декорирование - лучшая идея, чем множественное наследование?

Ответы [ 2 ]

4 голосов
/ 22 февраля 2012

С шаблоном декоратора вы можете декорировать объекты во время выполнения, в то время как множественное наследование является решением во время компиляции. Это позволяет вам свободно комбинировать разные декораторы с минимальными издержками, тогда как при множественном наследовании вам нужен новый класс для каждой комбинации декораторов.

Также трудно получить правильное множественное наследование, если вы наследуете все, кроме интерфейсных классов (классов, которые имеют только чисто виртуальные методы).

0 голосов
/ 22 февраля 2012

По-моему, это не шаблон декоратора, и вы, похоже, неправильно используете наследование.Перед наследованием спросите себя, верно ли утверждение: «Сын - это отец» или SpecificObject - это объект GeneralizedObject, который нельзя выразить.

Шаблон декоратора работает, передавая объект, который должен быть декорированк объекту, который его украшает.Типичным примером является BorderClass в Gui, который украшает виджет, который вы передаете ему, с рамкой.

 public class Border : Widget
   { 
       public Border(Widget decorateMe)
       { 
          this._toDecorate = decorateMe;
       }
       public virtual void draw(gc or whatnot){
          gc.drawRectangle(blah);
          this._toDecorate.draw(gc);
       }
   }

надеюсь, это поможет

...