witch doctor Geschrieben 23. September 2003 Geschrieben 23. September 2003 Kann mir jemand in einfachen Worten und an einem kleinen JAVA Beispiel erklären, was man nochmal unter Polymorphie zu verstehen hat. Zitieren
LoRDsTaR Geschrieben 23. September 2003 Geschrieben 23. September 2003 das du eine mehrfachvererbung in java verwenden kannst ( das ist aber nur über interfaces möglich da man in java eine klasse nur von einer anderen ableiten kann und nicht von mehreren ) Zitieren
Jaraz Geschrieben 23. September 2003 Geschrieben 23. September 2003 Original geschrieben von LoRDsTaR das du eine mehrfachvererbung in java verwenden kannst ( das ist aber nur über interfaces möglich da man in java eine klasse nur von einer anderen ableiten kann und nicht von mehreren ) Das ist so nicht richtig! Polymorphismus hat für sich gesehen, nicht zwingend mit Mehrfachvererbung zu tun, sondern besagt, dass eine Variable vom Typ einer Basisklasse zur Laufzeit unterschiedliche Objekte aus abgeleiteten Klassen aufnehmen kann. Beispiel aus www.javabuch.de http://gd.tuwien.ac.at/languages/java/GoToJava2/examples/Gehaltsberechnung.java Gruß Jaraz Zitieren
PerdianMG Geschrieben 23. September 2003 Geschrieben 23. September 2003 Naja Polymorphie an sich hat erstmal gar nichts mit Mehrfachvererbung zu tun, sondern besagt ganz einfach, dass ein Object die Eigenschaft hat als verschiedene Dinge in Erscheinung zu treten. Nehmen wir dochmal eine Klasse (oder noch besser ein Interface), die eine Methode enthält: public abstract Medium[] getMedium(Object[] irgendwelcheParameter); Je nach Implementierung, könnte die diese Methode jetzt die verschiedensten Medien zurückgeben. Als Vererbungsbaum vielleicht so Medium -- Textmedium ------ Zeitschrift ------ Buch -- Elektronisches Medium ---- CD ------ CD-ROM ------ DVD -- ... Polymorphie heisst jetzt nichts anderes, als das die genauen Medien im Array, die verschiedensten Implementierungen sein können, also beispielweise medium[0] = new Zeitschrift(); medium[1] = new DVD(); und so weiter Ciao Christian Zitieren
witch doctor Geschrieben 23. September 2003 Autor Geschrieben 23. September 2003 Ist das auch folgendes: Ich definiere in der Oberklasse eine Methode print(). Davon leite ich eine Klasse ab und definiere dort auch eine Methode print(), die die jeweilige print-Operation für diese Klasse ausführt. Im Hauptprogramm führt (durch die späte Bindung) weiß der Compiler welche Methode er nehmen muss. Kann man das auch unter Polymorphie verstehen? Ich meine durch diese Vielgestaltheit entsteht doch eine Polymorphie (daher ja der Name). Ist ja wie ein Brief ohne expliziten Empfänger, sondern nur einem Postfach. Wer genau die Post abholt wissen wir nicht. Erst in der Laufzeit erfahren wir wer die Post bekommt. Zitieren
PerdianMG Geschrieben 23. September 2003 Geschrieben 23. September 2003 Ich weiss nicht ob das Beispiel mit der Post und dem Empfänger so gut geeignet ist um den Begriff der Polymorphie auszudrücken, das würde ich anders ausdrücken: Wir haben eine Klasse "Beförderungsgegenstand", die bestimmte Eigenschaften hat. Dem Postboten, der die Pakete oder Briefe ausfährt ist es (im großen und ganzen *g*) egal, ob er nun eine Werbesendung oder ein Einschreiben ausliefert - es sind halt für ihn alles nur abstrakte Beförderungsgegenständer. Für mich als Empfänger spielt es ber eine ganz andere Rolle: Eine Einschreiben vom Gerichtsvollzieher ist ganz anders zu behandeln als die neuesten Werbeangebote der Geiz und Geil Märkte - und das ist schon Polymorphie. Zwei Objekte (ich und der Postbote) betrachten ein drittes Object (den Brief) aus unterschiedlichen Blickwinkeln und doch bleibt der Brief an sich jedesmal gleich. Ciao Chris Zitieren
Keith28 Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 Angenommen class A { A() { System.out.println("Konstruktor A"); } }; class B extends A { B() { System.out.println("Konstruktor B"); } }; public static void main(String[] args) { B b1 = new B(); A a1 = new B(); } Was ist hier A a1 = new B(); als bei B b1 = new B();. Ich verstehe nicht genau, was da anderes passiert. Hab schon rumgesurft im Web, aber nix gefunden was es mir verständlich macht. Zitieren
kingofbrain Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 Servus, ich habe leider Deine Frage nicht verstanden. Du hast zwei Klassen: A und B. B erbt von A. Jetzt istanzierst Du zwei mal B. Einmal weist Du es einer Variable vom Typ A, und einmal einer vom Typ B zu. Das geht, da ein B ja ein A ist. Ach ja, solche Beispiele sind ******e, weil man sich nichts vorstellen kann. Also neues Beispiel: Klassen Angestellter und Abteilungsleiter. Abteilungsleiter erbt Angestellter, denn ein Abteilungsleiter "ist ein" Angestellter der Firma. Deshalb kannst Du sagen: Angestellter a = new Abteilungsleiter(); Es geht aber nicht Abteilungsleiter b = new Angestellter();, da ein Angestellter nicht unbedingt ein Abteilungsleiter sein muss. Peter Zitieren
Keith28 Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 (bearbeitet) Hallo Peter, mit deinem Beispiel triffst du es besser. Hab jetzt auch mittlerweile nen Link gefunden der mir das in deinem Posting gut erklärt hat. Nur bei einer Sache überlege ich noch. Warum sollte man es so schreiben? Abteilungsleiter a = new Angestellter(); Warum schreibt man nicht immer Abteilungsleiter a = new Abteilungsleiter (); Ich erkenne den Vorteil oder besser gesagt auch die Notwendigkeit noch nicht, warum es so schreiben sollte Abteilungsleiter a = new Angestellter();. Denn bei dieser Schreibweise, hat a ja nur Zugriff auf die Variablen von der Klasse Angestellter. Und somit schränke ich doch dessen Funktionalität ein. Gruß Jochen Bearbeitet 13. Juni 2008 von Keith28 Zitieren
TDM Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 Wenn du einen Angestellten beförderst, wird er ein Abteilungsleiter. folglich: Angestellter a = new Angestellter(); Angestellter b = new Angestellter(); Abteilungsleiter l = null; //tue irgendwas mit a if (a.hatIrgendwas()) { [INDENT]l = a;[/INDENT] l.verteileArbeitan(; } else { [INDENT]l = b;[/INDENT] l.verteileArbeitan(a); } [/code] Zitieren
Keith28 Geschrieben 13. Juni 2008 Geschrieben 13. Juni 2008 Also ich erkläre es mir jetzt so. Angestellter a1; a1 = new Abteilungsleiter; d.h. Ich erzeuge ein Objekt der Klasse Angestellter, welches mit den Werten des Konstruktes aus der Klasse Abteilungsleiter gefüllt wird. Es ist aber nachwievor ein Angestellter. Und erst durch Casten hab ich dann wieder zugriff auf die Objektattribute der klasse Abteilungsleiter. Zitieren
kingofbrain Geschrieben 16. Juni 2008 Geschrieben 16. Juni 2008 Servus, Dein Beispiel geht gar nicht: Abteilungsleiter a = new Angestellter() macht keinen Sinn, weil nicht jeder Angestellter ein Abteilungsleiter ist. Aber umgekehrt macht es schon Sinn. Es gibt in der Objektorientierung die Forderung, nicht gegen die konkrete Implementierung zu entwickeln, sondern gegen eine abstrakte Schnittstelle. Deshalb schreibt man auch z.B. so was: List l = new ArrayList(); Die ArrayList ist eine Implementierung des List-Interface. Jeder, der jetzt weiß, dass mein Objekt l eine Liste ist, weiß alles, was er wissen muss. Welche spezielle Implementierung das jetzt konkret ist, ist in den meisten Fällen egal. Und in unserem Angestellten-Beispiel gibt es auch Anwendungsfälle. Du hast z.B. eine Verwaltung der Mitarbeiter in einem Unternehmen. Du willst für diese Mitarbeiter die internen Telefonnummern und E-Mail Adressen verwalten. Ob ein Mitarbeiter jetzt Angestellter oder Abteilungsleiter ist, ist Dir für diesen Use Case völlig egal. Also arbeitest Du mit einer Liste von Angestellten. Abteilungsleiter sind auch Angestellte, und Du kannst mit einer allgemeinen Methode ohne Unterscheidung für verschiedene Hierarchieebenen auskommen. Peter 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.