Hallo zusammen,
ich arbeite mich gerade durch das Buch "Entwurfsmuster von Kopf bis Fuß" Die Beispiel sind allerdings in Java
ich hab jetzt folgenden Code
Delphi-Quellcode:
unit Unit2;
interface
type
Getraenk =
class abstract (TObject)
Beschreibung :
string;
constructor Create;
function GetBeschreibung :
string;
function Preis : Real;
virtual;
abstract;
end;
ZutatenDekorierer =
class abstract (Getraenk)
function GetBeschreibung :
string;
virtual;
abstract;
end;
// Konkrete Komponente (Kaffesorten)
Espresso =
class (Getraenk)
constructor Create;
function Preis : Real;
override;
end;
Hausmischung =
class (Getraenk)
constructor Create;
function Preis : Real;
override;
end;
DunkleRoestung =
class (Getraenk)
constructor Create;
function Preis : Real;
override;
end;
// konkrete Dekoriere (Zutaten)
Schoko =
class(ZutatenDekorierer)
ActGetraenk : Getraenk;
constructor Create(iGetraeng:Getraenk);
function GetBeschreibung :
string;
override;
function Preis : Real;
override;
end;
HeisseMilch =
class(ZutatenDekorierer)
ActGetraenk : Getraenk;
constructor Create(iGetraeng:Getraenk);
function GetBeschreibung :
string;
override;
function Preis : Real;
override;
end;
implementation
uses Dialogs;
{ Getraenk }
constructor Getraenk.Create;
begin
Beschreibung := '
Unbekanntes Getränk';
end;
function Getraenk.GetBeschreibung:
string;
begin
result := Beschreibung;
end;
{ Espresso }
constructor Espresso.Create;
begin
Beschreibung := '
Espresso';
end;
function Espresso.Preis: Real;
begin
result := 1.99;
end;
{ Hausmischung }
constructor Hausmischung.Create;
begin
Beschreibung := '
Hausmischung';
end;
function Hausmischung.Preis: Real;
begin
result := 0.89;
end;
{ DunkleRoestung }
constructor DunkleRoestung.Create;
begin
Beschreibung := '
Dunkle Röstung';
end;
function DunkleRoestung.Preis: Real;
begin
Result := 0.99;
end;
{ Schoko }
constructor Schoko.Create(iGetraeng: Getraenk);
begin
// ShowMessage(iGetraeng.Beschreibung);
ActGetraenk := iGetraeng;
end;
function Schoko.GetBeschreibung:
string;
begin
result := ActGetraenk.GetBeschreibung + '
, Schoko';
end;
function Schoko.Preis: Real;
begin
result := ActGetraenk.Preis + 0.20;
end;
{ HeisseMilch }
constructor HeisseMilch.Create(iGetraeng: Getraenk);
begin
ActGetraenk := iGetraeng;
end;
function HeisseMilch.GetBeschreibung:
string;
begin
Result := ActGetraenk.Beschreibung + '
, Heiße Milch';
end;
function HeisseMilch.Preis: Real;
begin
result := ActGetraenk.Preis + 0.10;
end;
end.
Wenn ich jetzt
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
Getraenk1 : Getraenk;
begin
Getraenk1 := DunkleRoestung.Create;
Getraenk1 := Schoko.Create(Getraenk1);
Getraenk1 := Schoko.Create(Getraenk1);
Getraenk1 := HeisseMilch.Create(Getraenk1);
ShowMessage(Getraenk1.GetBeschreibung + ' ' + format('%f',[Getraenk1.Preis]));
end;
bekomme ich keine Bezeichnung angezeigt. Eigentlich sollte "HeisseMilch, Schoko, Schoko Dunkle Röstung" + Preis angezeigt werden.
Ich bekomme aber nur den Preis. Wenn ich die Dekoriere weg lasse und nur sage
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
Getraenk1 : Getraenk;
begin
Getraenk1 := DunkleRoestung.Create;
ShowMessage(Getraenk1.GetBeschreibung + ' ' + format('%f',[Getraenk1.Preis]));
end;
bekomme ich den Text Dunkle Röstung angezeigt.
Ich versteh's nicht