Decorator-Pattern
-
Hallo,
ich versuche grade, ein kleines Beispiel für das Decorator-Pattern zu erstellen, jedoch habe ich bei der Vererbung Probleme.
Hier mal mein Code:
#include <iostream> using namespace std; class Spielfigur { public: virtual void properties() { cout << "Diese Figur hat folgende Eigenschaften:\n"; } Spielfigur() {} }; class Schachfigur : public Spielfigur { public: virtual void properties() { cout << "Diese Schachfigur hat folgende Eigenschaften:\n"; } }; class Decorator : public Spielfigur { public: Decorator(Spielfigur& s) : myFigur(s) {} protected: Spielfigur myFigur; }; class DameDekorierer : public Decorator { public: DameDekorierer(Spielfigur& s) : Decorator(s) { } virtual void properties() { myFigur.properties(); cout << "Sie ist eine Dame\n"; } }; int main() { Spielfigur figur; Spielfigur dame=DameDekorierer(figur); dame.properties(); }Bei Ausfuehren des Programms wird nur die Methode der Klasse Spielfigur ausgegeben, nicht die Methode von der Klasse DameDekorierer. Wie kann ich dies ändern, ohne in der main-Methode den Aufruf "DameDekorierer dame=DameDekorierer(figur)" zu nutzen? Ist dies überhaupt moeglich?
Achja, ich weiß, dass das Dekorierer-Pattern für Spielfiguren nicht die sinnvollste Möglichkeit ist, sondern vllt eher das Fabrikmuster. Es dient lediglich nur dazu, das Pattern zu lernen.
-
Ein typischer Fall von Slicing.
Probiers mal so:
Spielfigur & dame = DameDekorierer(figur); //&
-
Mit dem & kommt folgender Fehler:
Decorator.cpp:51: error: invalid initialization of non-const reference of type 'Spielfigur&' from a temporary of type 'DameDekorierer'
-
DameDekorierer deko(figur); Spielfigur & dame = deko;Oder Du machnst eine
const-Referenz davon, aber dann müssen die aufgerufenen Methoden auchconstsein.
-
Zur ersten Sache:
Dann müsste ich ja, wenn ein bestimmtes Objekt noch weiter dekoriert werden sollte, immer neue Objekte dieser Dekoration erstellen, oder?Also wenn zb die Dame nicht nur eine Dame ist, sondern auch eine TolleDame, die dann weitere Eigenschaften hat.
Dann bräuchte ich doch zb ein Objekt "toll" des Typs TollerDekorierer, ein Objekt "dame" des Typs "DameDekorierer" und das Objekt figur.Ist das richtig?
Kurz implementiert:
class TollerDekorierer : public Decorator { public: TollerDekorierer(Spielfigur& s) : Decorator(s) {} virtual void properties() const { myFigur.properties(); cout << "Sie ist toll.\n"; } }; int main() { Spielfigur figur; DameDekorierer deko(figur); TollerDekorierer toll(deko); const Spielfigur& dame=toll; dame.properties(); }
-
Decorator selber muss auch eine Referenz enthalten! 
-
Ah, das wurde schon geändert, das Attribut im Decorator ist Spielfigur& myFigur.
Damit ich diese Objekte nicht vorher erstellen muss, sondern direkt
Spielfigur& tolleDame=TollerDekorierer(DameDekorierer(figur));schrieben kann, muss noch wo ein const hin, aber wo genau? Alle properties()-Methoden sind jetzt
virtual void properties() constund die Konstruktoren der Dekorierer haben als Attribut "const Spielfigur& s".