Zum Inhalt springen

Empfohlene Beiträge

Geschrieben
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

Geschrieben

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

Geschrieben

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.

Geschrieben

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

  • 4 Jahre später...
Geschrieben

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.

Geschrieben

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

Geschrieben (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 von Keith28
Geschrieben

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]

Geschrieben

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.

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...