Eleu Geschrieben 29. Januar 2021 Geschrieben 29. Januar 2021 Hallo, ich habe eine Frage zu dem nachfolgenden java Code public class A { public void todo(){ B xy = new B(); xy.todo(this); //.. Weitere Methoden in Klasse A } } public class B { public void todo(A k){ System.out.println("Mach was"); } } public class Haupt{ public static void main(String [] args){ A z = new A(); z.todo(); } } Wenn ich in der Klasse Haupt, die Main Methode ausführe, wird mir der Text "Mach was" ausgegeben. Diese Methode ist in Klasse B enthalten und wird durch die Instanz xy und dem Schlüsselwort this der Klasse A verfügbar gemacht. Man könnte aber auch alternativ eine Einfachvererbung programmieren und käme zum gleichen Ergebnis, wenn man die Main Methode ausführt. public class A extends B { } public class B { public void todo(){ System.out.println("Mach was"); } } public class Haupt{ public static void main(String [] args){ A z = new A(); z.todo(); } } Meine Frage wäre, was es mir für einen Vorteil bringt, wenn ich es so mache wie im ersten Beispiel? Ich hätte ja erst mal sogar den Nachteil, nur diese eine Methode aus Klasse B, in der Klasse A zur Verfügung zu haben. Wenn ich es mit extends mache kann ich sofort auf alle weiteren Methoden, insofern es noch weitere Methoden in Klasse B gäbe, zugreifen. Gruß Eleu Zitieren
Whiz-zarD Geschrieben 29. Januar 2021 Geschrieben 29. Januar 2021 Wo kommt denn dieses Beispiel her? Ohne den Kontext zu verstehen, was das Beispiel ausdrücken soll, kann man wohl keine Antwort geben. Im Grunde passiert nur folgendes: Du erzeugst eine Instanz der Klasse A und rufst die Methode todo() dieser Instanz auf. Die Instanz der Klasse A wiederrum erzeugt eine Instanz der Klasse B und ruft wiederum todo() der Instanz von B auf. Deine Main-Methode könnte auch direkt eine Instanz der Klasse B erzeugen: public static void main(String [] args){ B b = new B(); b.todo(new A()); } Der Parameter von todo() in der Klasse B hat überhaupt keine Bewandtnis und kann entfernt werden. Zitieren
Eleu Geschrieben 29. Januar 2021 Autor Geschrieben 29. Januar 2021 vor 13 Minuten schrieb Whiz-zarD: Wo kommt denn dieses Beispiel her? Ohne den Kontext zu verstehen, was das Beispiel ausdrücken soll, kann man wohl keine Antwort geben. Im Grunde passiert nur folgendes: Ein ähnliches Beispiel gibt es hier (Im Link weiter unten): Java this! Ein verwirrendes Schlüsselwort? | lerne Programmieren (codeadventurer.de) Ich verstehe den Kontext ja selber nicht, weil ich nicht weiß, oder verstehe, wann man das so macht, wenn man es auch gleich über eine Einfachvererbung machen könnte. Was bringt es mir für einen Vorteil, oder anders gefragt, bei welchem Anwendungsfall würde man es so wie in dem Beispiel machen Zitieren
Whiz-zarD Geschrieben 29. Januar 2021 Geschrieben 29. Januar 2021 Ich glaub, du hast das Beispiel nicht verstanden. Es geht hier nicht um eine Vererbung. Ausgangslage ist eine Waschanlage, die die Methode wasche() hat und ein Fahrzeug als Parameter hat: public class Waschanlage { public void wasche(Fahrzeug fahrzeug) { // mache irgendwas mit fahrzeug } Nun soll die Klasse Fahrzeug die Methode wasche() bekommen: public class Fahrzeug { public void wasche() { Waschanlage w = new Waschanlage(); w.wasche(this); } Das hat jetzt den Vorteil, dass die Waschanlage nicht elementarer Bestandteil des Fahrzeuges ist und außerhalb des Fahrzeuges verwendet werden kann. Ich kann also auch: Fahrzeug f = new Fahrzeug(); Waschanlage w = new Waschanlage(); w.wasche(f); schreiben. Eine Vererbung würde hier nicht klappen, da ein Fahrzeug nun mal keine Waschanlage ist. Allerdings würde man dies in der Praxis so nicht schreiben, da Fahrzeug abhängig von der Waschanlage wäre aber das ist ein anderes Thema. JimTheLion reagierte darauf 1 Zitieren
Defneqon Geschrieben 18. Februar 2021 Geschrieben 18. Februar 2021 (bearbeitet) Joa, der Kontext fehlt hier irgendwie. Ich bin zwar kein Java-Entwickler, aber im Beispiel 1 wird die Methode todo in Klasse A an die todo-Methode von Klasse B delegiert. Damit haben wir mit Klasse A einen sogenannten Wrapper / Decorator um Klasse B gebaut. Indem ich nun ein Objekt von Klasse A instanziere, instanziere ich automatisch ein Objekt von B. Das Verfahren kann in bestimmten Kontexten (der hier einfach fehlt) von Vorteil sein, wenn man im top-level-Aufruf einfach noch mehr Dinge macht, die im Aufruf der Subklasse einfach nichts verloren haben. Es handelt sich hier schlichtweg um eine Delegation. EDIT: OK, nvm. Mit dem Beispiel von @Whiz-zarD sollte ja klar sein. Bearbeitet 18. Februar 2021 von Defneqon Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.