Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
hi,
zum Thema Dekorator Muster hab ich den Code gesehen:
Code:
Getraenk getränk3 = new HausMischung();
getränk3 = new Soja(getränk3);
getränk3 = new Schoko(getränk3);
getränk3 = new Milchschaum(getränk3);
alle Objekte rechts erben von Getränk... nun allerdings find ich komisch das getränk3 eine Referenz auf Hausmischung ist, in der nächsten Zeile dann erzeuge ich ein neues Soja, übergeb diesem die referenz auf getränk3 zu und lasse danach getränk 3 auf soja zeigen, stimmt die Reihenfolge überhaupt?
oder wird erst der Zeiger getränk 3 auf das neue Objekt Soja umgebogen, und dann versucht als Parameter die alte referenz getränk3 zu übergeben? dann würde er sich ja selbst übergeben :lol:
oder stimmt die erste Version so? kann mir das einer erläutern?
alle Objekte rechts erben von Getränk... nun allerdings find ich komisch das getränk3 eine Referenz auf Hausmischung ist, in der nächsten Zeile dann erzeuge ich ein neues Soja, übergeb diesem die referenz auf getränk3 zu und lasse danach getränk 3 auf soja zeigen, stimmt die Reihenfolge überhaupt?
ok aber wie war das nochmal, wenn ich eine Referenz einer Oberklasse habe und erzeuge eine Unterklasse und die Referenz zeigt auf diese Unterklasse, kann ich dann nur Methoden der Oberklasse aufrufen, bzw. benutzen? oder findet intern ein cast statt oder wie, oder gilt das nur für erzeugte objekte der Oberklasse , deren Referenz ich dann später auf erzeugte Objekte einer Unterklasse zeige?
Hi,
Also wenn du eine Instanz der Basisklasse erstellst, kannst du in dieser Instanz nur auf die Methoden der Basisklassen zugreifen.
Wenn du eine eine Instanz einer ErweiterteKlasse erstellst, dann kann diese Instanz auf die Methoden der Basis und der ErweiterteKlasse zugreifen.
Wenn du die Instanz der ErweiterteKlasse der Instanz der Basisklasse zuweisen willst, dann findet ein upcasting automatisch statt.
Wenn du eine Instanz der Baisklasse einer ErweiterteKlasse zuweisen willst, dann muss downcasting gemacht werden.
In etwa so:
Java:
public static void main(String[] args) {
Basisklasse b = new Basisklasse();
b.setString("Ein String der Instanz Basisklasse");
ErweiterteKlasse e = new ErweiterteKlasse();
e.setString("Ein String der Instanz ErweiterteKlasse");
e.setInt(1);
System.out.println(b);
System.out.println(e);
b = e; // upcasting
e = (ErweiterteKlasse)b; // downcast
System.out.println(b);
System.out.println(e);
}
ok aber das war nicht die Frage, ich wollte wissen wie das ist mit den Methoden die den jeweiligen Klassen zu eigen ist, ob man die noch benutzen kann je nachdem welche Referenz eienr Klasse auf mein jeweilges Objekt zeigt, da war doch noch irgendwas ...
wenn ich eine Oberklassereferenz auf ein Unterklasseobjekt zeigt, kann ich ja durch polymorphie immer die jew. Eigenschaften der Unterklasse ausführen, weiss nimmer wie das mit dem casting zu objekten war, von unterklasse nach oberklasse usw. ob dann noch die methoden der unterklasse ausführbar sind, ich glaube nicht..
public class Kleidung {
private String name;
public String getName() {
return name;
}
}
public class Jacke extends Kleidung {
private boolean zip;
public void oeffneZip() {
zip = true;
}
}
public class Schuhe extends Kleidung {
private boolean gebunden;
public void bindeSchuhe() {
gebunden = true;
}
}
......
Kleidung k = new Kleidung("eine kurze hose");
k.getName(); // Aufruf ohne Probleme möglich
k.oeffneZip(); // nicht möglich da oeffneZip eine Methode der Klasse Jacke ist, wir hier aber eine Referenz auf ein Objekt Kleidung haben
k = new Jacke("eine schwarze jacke");
k.getName(); // Aufruf ohne Probleme möglich
k.oeffneZip(); // nicht möglich. da "k" nur auf ein Objekt von Kleidun verweist. Ob dieses Objekt nun eine Jacke oder ein Schuh ist, weiß man an dieser stelle nicht. Daher werden nur Methode der entsprechenden Klasse -> Kleidung angeboten
Jacke j = new Jacke("eine schwarze Jacke");
j.getName(); // Aufruf ohne Probleme möglich, da "getName" in der Superklasse definiert ist
j.oeffneZip(); // Aufruf möglich, da "j" auf ein Objekt der Klasse Jacke zeigt