Laden...

DecoratorPattern - Dynamische Bindung?

Erstellt von m0rius vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.416 Views
m0rius Themenstarter:in
1.002 Beiträge seit 2007
vor 15 Jahren
DecoratorPattern - Dynamische Bindung?

Hallo,

warum funktioniert im folgenden Codeabschnitt keine dynamische Bindung?
Hinweis: Schoko verwendet das DecoratorPattern (Beispiel aus dem 2. Kapitel von "Head first design patterns").

Getraenk getraenk = new Espresso();            
getraenk = new Schoko(getraenk);            
Console.WriteLine("Getraenk: " + getraenk.GetBeschreibung());

Es wird hier die Methode GetBeschreibung() der Klasse Getraenk anstelle der Methode aus der Klasse Schoko aufgerufen.

Schreibe ich hingegen ...

Getraenk getraenk = new Espresso();            
getraenk = new Schoko(getraenk);            
Console.WriteLine("Getraenk: " + ((Schoko)getraenk).GetBeschreibung());

..., funktioniert alles. Warum?

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

C
43 Beiträge seit 2008
vor 15 Jahren

Hallo,
hoffe mal ich sag jetzt nix falsches, vor allem, weil mir DecoratorPattern nix sagt. aber getraenk ist ein Getraenk, siehe 1. Zeile. Also ruft er Getraenk.GetBeschreibung() auf. Wenn du getraenk als Schoko castest, Siehe 2.Listing 3. Zeile, dann behandelt er getraenk als Schoko und ruft Schoko.GetBeschreibung() auf.

Lösung: in der Basisklasse Getraenk GetBeschreibung() als virtual markieren, und in den abgeleiteten Klassen als override.

Bitte korrigiert mich, falls ich was falsches gesagt habe.

Christian

3.003 Beiträge seit 2006
vor 15 Jahren

Scheint korrekt zu sein. Im Gegensatz zu Java (wie in Head first) benötigen überschreibbare Methoden in C# das Schlüsselwort "virtual".

Bitte gewöhn dir gleich an, beim Umsetzen der Beispiele aus dem Buch die C#-Konventionen zu übernehmen: Properties statt Get- und Set-Methoden, die Groß- und Kleinschreibung und so weiter. Ist 'ne gute Übung.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

5.941 Beiträge seit 2005
vor 15 Jahren

Hallo zusammen

Jep, in Java ist alles implizit virtual.
Ein Beispiel für C# findest du hier:

BTW: Das nächste Mal wäre mehr Details zu den Klassen erwünscht.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

3.003 Beiträge seit 2006
vor 15 Jahren

Ah, geh. Die meisten hier können "Head First Design Patterns" doch auswendig 😉

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

m0rius Themenstarter:in
1.002 Beiträge seit 2007
vor 15 Jahren

Hallo chriss99,

nein, nachdem getraenk = new Schoko(getraenk); gesetzt wurde, liefert getraenk.GetType(); Schoko ...

Hallo LaTino,

du hast mich mit deinem Post auf die Lösung gebracht - danke 😃.
Ich habe in einer abstrakten Klasse, die sozusagen "zwischen" Getraenk und Schoko liegt, das Schlüsselwort override vergessen. Es gab aufgrund der Überlagerung keinen Compilerfehler ...

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

3.003 Beiträge seit 2006
vor 15 Jahren

Es gab aufgrund der Überlagerung keinen Compilerfehler ...

Oh, toll, ein Haar zum Spalten. Überdeckung.

😉

LaTino, Wochenende naht, Albernheitspegel steigend.

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

C
43 Beiträge seit 2008
vor 15 Jahren

Ah, geh. Die meisten hier können "Head First Design Patterns" doch auswendig 😉

Also, ich hab bisher noch net davon gehört. aber nach eine ersten flüchtigen Blick in den Wiki-lInk siehts interessant aus.
Heißt das, dass man nach

Getraenk getraenk = new Espresso();
getraenk = new Schoko(getraenk);

einen Espresso mit schokolade hat?

3.003 Beiträge seit 2006
vor 15 Jahren

Stell mal hier im Forum in den Buchempfehlungen eine Suche nach Head First an.

Unbedingt empfehlenswert.

LaTino
EDIT: ja, so ähnlich funktioniert das. Der Gag an der Sache ist, das man einen Preis für Schokolade, und einen für Espresso, und einen für Zucker, und einen für Sahne machen kann, und sich dann zB einen doppelten Espresso zusammenstellen kann:


Getraenk getraenk = new Espresso();
getraenk = new Espresso(getraenk);
getraenk = new Schoko(getraenk);
getraenk = new Sahne(getraenk);
Console.Write(getraenk.BerechnePreis().ToString());

Decorator at work. Sehr elegantes Pattern.

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

5.941 Beiträge seit 2005
vor 15 Jahren

Hallo LaTino

Ah, geh. Die meisten hier können "Head First Design Patterns" doch auswendig 😉

Ah, wieder ein Haar zum spalten g
Siehe fettgemachtes 😃

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

2.187 Beiträge seit 2005
vor 15 Jahren

Hallo Peter Bucher,

Ich würde mich auf LaTinos Seite des Haar stellen. 😃

Gruß
Juy Juka