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
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
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)
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
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)
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
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)
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?
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)
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
Hallo Peter Bucher,
Ich würde mich auf LaTinos Seite des Haar stellen. 😃
Gruß
Juy Juka