64
Polymorphie (Vielgestaltigke it)

Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Embed Size (px)

Citation preview

Page 1: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Polymorphie(Vielgestaltigkeit)

Page 2: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Anschaulich:

Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen:- Fahrzeug zu Wasser- Fahrzeug an Land- Fahrzeug in der Luft

Page 3: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Wenn eine Methode, wie z.B. printGeoForm() für verschiedene Programmteile steht (und z.B. einmal Objekte verschiedener Klassen wie z.B. Rechtecke oder das andere Mal Kreise auf dem Bildschirm ausgeben bzw. zeichnen kann), dann nennt man dies Polymorphie

Page 4: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Beispiel:In einem Feld sollen verschiedene Objekte (entweder Rechtecke oder Kreise) abgespeichert und dann (z.B. zu Testzwecken) deren spezifischen Daten (Länge und Breite bzw. Radius) ausgegeben werden

Page 5: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Die Reihenfolge der Objekte (Rechteck bzw. Kreis) in dem Feld soll vom Anwender bestimmt werden bzw. zufällig sein.

Page 6: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Aber Halt:In einem Feld können nur Objekte der gleichen Klasse gespeichert werden.

Page 7: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Deswegen muß man eine Oberklasse von Rechteck und Kreis erzeugen und Objekten der Oberklasse, Objekte der Unterklassen Rechteck oder Kreis zuweisen und die Objekte der Oberklasse im Feld speichern.

Page 8: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Vorgehensweise:Man erzeugt die Klassen Rechteck und Kreis mit jeweils der spezifischen printGeoForm() Methode, die den Flächeninhalt und den Umfang des Rechtecks bzw. des Kreises ausgibt.

Page 9: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Dann erzeugt man eine gemeinsame Basisklasse, z.B. mit dem Namen GeoForm der Klassen Rechteck und Kreis.

Page 10: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

In UML-Darstellung:

Page 11: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

GeoForm + printGeoForm(): void

Rechteck + printGeoForm(): void

Kreis + printGeoForm(): void

Page 12: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Mit new werden (in einer Schleife) jeweils ein Rechteck bzw. ein Kreis erzeugt und einem Element des Feldes (der Klasse GeoForm) zugewiesen.

Page 13: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

GeoForm feld k1 r1 r2 r3 k2 r4

Und jetzt die wunderbare Eigenschaft der Polymorphie:

Der Programmierer muss nicht in einer Schleife jedes Mal überprüfen, ob es sich um einen Kreis oder ein Rechteck handelt und dann die entsprechende Methode aufrufen, die die Daten dieser Figur auf dem Bildschirm ausgibt, sondern ....

Der Programmierer will jetzt die Daten der Figuren auf dem Bildschirm ausgeben.

Es werden zufallsbestimmt jeweils entweder die Figuren Kreis oder Rechteck in das Array feld der Klasse GeoForm eingefügt.

Das Programm weiß von selbst, welche Methode es von welcher Klasse (Rechteck oder Kreis) aufrufen muss!!

Page 14: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Als Programm-Skizze

Page 15: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Bemerkung:Der Einfachheit halber ist die Reihenfolge der Rechtecke bzw. Kreise in der folgenden Programm-Skizze nicht zufällig bzw. vom Anwender vorgegeben und außerdem ist die Schleife weggelassen worden.

Page 16: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

GeoForm[] feld; Es wird Speicher für eine Referenz (Pointer) auf das Array feld reserviert.

feld

Adresse

Inhalt

0120

0470 null

null

null

...

...

?

Da feld eine lokale Variable ist, ist der Wert undefiniert.

feld=new GeoForm[3];

Es wird Speicher für das Array feld reserviert, das aus lauter Referenzen (Pointern) mit dem vorbelegten Wert null, besteht.

Welchen Wert muss feld bekommen, damit es auf das gerade angelegte Objekt zeigt?

Auf die (Anfangs)Adresse dieser Speicherbereiche hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest.

feld[0]

feld[1]

feld[2]

Page 17: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

GeoForm[] feld; Es wird Speicher für eine Referenz (Pointer) auf das Array feld reserviert.

feld

Adresse

Inhalt

0120

0470 null

null

null

...

...

Da feld eine lokale Variable ist, ist der Wert undefiniert.

feld=new GeoForm[3];

Es wird Speicher für das Array feld reserviert, das aus lauter Referenzen (Pointern) mit dem vorbelegten Wert null, besteht.

Welchen Wert muss feld bekommen, damit es auf das gerade angelegte Objekt zeigt?

Auf die (Anfangs)Adresse dieser Speicherbereiche hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest.

feld[0]

feld[1]

feld[2]

Page 18: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

GeoForm[] feld; Es wird Speicher für eine Referenz (Pointer) auf das Array feld reserviert.

feld

Adresse

Inhalt

0120

0470 null

null

null

...

...

Da feld eine lokale Variable ist, ist der Wert undefiniert.

feld=new GeoForm[3];

Es wird Speicher für das Array feld reserviert, das aus lauter Referenzen (Pointern) mit dem vorbelegten Wert null, besteht.

Welchen Wert muss feld bekommen, damit es auf das gerade angelegte Objekt zeigt?

Auf die (Anfangs)Adresse dieser Speicherbereiche hat der Programmierer keinen Einfluß. Diese legt der Interpreter bzw. Programmlader fest.

feld[0]

feld[1]

feld[2]

0470

Page 19: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

GeoForm[] feld;

feld 0120

0470 null

null

null

...

...

feld = new GeoForm[3];

feld[0]

feld[1]

feld[2]

0470

feld[0] = new Kreis(2);Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt erzeugt, auf das feld [0] zeigen soll.

Welchen Inhalt hat diese Adresse und wer legt diesen fest?

Es ist der Wert des Radius des neu angelegten Kreises, der durch den Aufruf des Konstruktors festgelegt wird.

0700 2

Page 20: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

GeoForm[] feld;

feld 0120

0470 null

null

null

...

...

feld[0]

feld[1]

feld[2]

0470

feld[0] = new Kreis(2);

0700 2

Welchen Wert muss feld[0] bekommen, damit es auf das gerade angelegte Objekt zeigt?

feld = new GeoForm[3];

Page 21: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

GeoForm[] feld;

feld 0120

0470

null

null

...

...

feld[0]

feld[1]

feld[2]

0470

feld[0] = new Kreis(2);

0700 2

Welchen Wert muss feld[0] bekommen, damit es auf das gerade angelegte Objekt zeigt?

feld = new GeoForm[3];

Page 22: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

GeoForm[] feld;

feld 0120

0470

null

null

...

...

feld[0]

feld[1]

feld[2]

0470

feld[0] = new Kreis(2);

0700 2

Welchen Wert muss feld[0] bekommen, damit es auf das gerade angelegte Objekt zeigt?

0700

feld = new GeoForm[3];

Page 23: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

GeoForm[] feld;

feld 0120

0470

null

null

...

...

feld[0]

feld[1]

feld[2]

0470

feld[0] = new Kreis(2);

Es wird im Arbeitsspeicher an einer bestimmten Adresse Platz für das Objekt erzeugt, auf das feld [1] zeigen soll.

Welchen Inhalte stehen an dieser Adresse und wer legt diese fest?

feld[1] = new Rechteck(10,20);

0800 10

20...

0700 2

0700

feld = new GeoForm[3];

Page 24: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

GeoForm[] feld;

feld 0120

0470

null

null

...

...

feld[0]

feld[1]

feld[2]

0470

feld[0] = new Kreis(2);feld[1] = new Rechteck(10,20);Es ist der Wert der Breite und Länge des neu angelegten Rechtecks, das durch den Aufruf des Konstruktors festgelegt wird.

0800 10

20...

0700 2

0700

feld = new GeoForm[3];

Page 25: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

GeoForm[] feld;

feld 0120

0470

null

null

...

...

feld[0]

feld[1]

feld[2]

0470

feld[0] = new Kreis(2);feld[1] = new Rechteck(10,20);

0800 10

20...

0700 2

0700

Welchen Wert muss feld[1] bekommen, damit es auf das gerade angelegte Objekt zeigt?

feld = new GeoForm[3];

Page 26: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

GeoForm[] feld;

feld 0120

0470

null

...

...

feld[0]

feld[1]

feld[2]

0470

feld[0] = new Kreis(2);feld[1] = new Rechteck(10,20);

0800 10

20...

0700 2

0700

feld = new GeoForm[3];

Page 27: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

GeoForm[] feld;

feld 0120

0470

null

...

...

feld[0]

feld[1]

feld[2]

0470

feld[0] = new Kreis(2);feld[1] = new Rechteck(10,20);

0800 10

20...

0700 2

0700

0800

feld = new GeoForm[3];

Page 28: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

GeoForm[] feld;

feld[0] = new Kreis(2);feld[1] = new Rechteck(10,20);feld[0].printGeoForm();feld[1].printGeoForm();Welche printGeoForm() Methode wird nun in feld[0] bzw. feld[1] aufgerufen?

Welche 3 Möglichkeiten kann es geben?

1) printGeoForm() in der Klasse GeoForm2) printGeoForm() in der Klasse Rechteck3) printGeoForm() in der Klasse Kreis

feld = new GeoForm[3];

Page 29: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

GeoForm[] feld;

feld[0] = new Kreis(2);feld[1] = new Rechteck(10,20);feld[0].printGeoForm();feld[1].printGeoForm();Es wird nicht die Methode der Referenzvariablen feld, also printGeoForm() der Klasse GeoForm aufgerufen, sondern die Methode der Klasse des Objekts, auf das die Referenzvariable feld (feld[0], feld[1], ...) zeigt, also hier printGeoForm() der Klasse Rechteck bzw. printGeoForm() der Klasse Kreis.

feld = new GeoForm[3];

Page 30: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

GeoForm[] feld;

feld[0] = new Kreis(2);feld[1] = new Rechteck(10,20);feld[0].printGeoForm();feld[1].printGeoForm();Noch genauer:Es wird die Methode des Objekts aufgerufen, die in der Vererbungshierarchie am niedersten ist. Also:Wenn es in der Klasse Rechteck die Methode printGeoForm() gibt, wird diese aufgerufen, sonst die Methode printGeoForm() der Klasse GeoForm.Wenn es in der Klasse Kreis die Methode printGeoForm() gibt, wird diese aufgerufen, sonst die Methode printGeoForm() der Klasse GeoForm.

feld = new GeoForm[3];

Page 31: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

GeoForm[] feld;

feld[0] = new Kreis(2);feld[1] = new Rechteck(10,20);feld[0].printGeoForm();feld[1].printGeoForm();Was macht also:feld[0]. printGeoForm()

Radius 2 des Kreises ausgeben.

Was macht also:feld[1]. printGeoForm()

Breite 10 und Länge 20 des Rechtecks ausgeben.

feld = new GeoForm[3];

Page 32: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Das exakte Programm:

Page 33: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

public class MainPoly{ public static void main(String[] args){ int i; double zufall; GeoForm[] feld; feld=new GeoForm[3];

Page 34: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

for(i=0;i<3;i++){ zufall = Math.random(); if (zufall<0.5){ feld[i] = new Kreis(2); } else{ feld[i] = new Rechteck(10,20); } } for(i=0;i<3;i++){ feld[i].printGeoForm(); } }}

Page 35: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

// Klasse Geometrische Form

class GeoForm { public void printGeoForm(){ }}Die Methode printGeoForm() wird unbedingt benötigt, auch wenn sie aus keinen Anweisungen besteht. Diese Methode wird ja von den Methoden printGeoForm() der Unterklassen Rechteck und Kreis überschrieben.

Die Methode printGeoForm() der Klasse GeoForm kann natürlich auch Anweisungen haben. Ebenso kann die Klasse GeoForm auch Attribute und weitere Methoden besitzen. Auf diese Methoden in GeoForm kann in den Unterklassen auch zugegriffen werden, wie z.B:mit super. printGeoForm() oder mit super(...) in einem Konstruktor einer Unterklasse.

Page 36: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

class Rechteck extends GeoForm{ private double l; private double b;

public Rechteck(double pl, double pb){ setLaenge(pl); setBreite(pb); }

public void setLaenge( double pl){ l = pl; }

Page 37: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

public void setBreite( double pb){ b = pb; }

public double getLaenge(){ return(l); }

public double getBreite(){ return(b); }

Page 38: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

public void printGeoForm(){ System.out.print("Zeichnet Rechteck mit: "); System.out.print("Laenge= "+getLaenge()); System.out.println(" und Breite= "+getBreite()); }}

Page 39: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

class Kreis extends GeoForm{ private double r;

public Kreis(double pr){ setRadius(pr); }

public void setRadius( double pr){ r = pr; }

public double getRadius(){ return(r); }

Page 40: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

public void printGeoForm(){ System.out.println("Zeichnet Kreis mit Radius=" +getRadius()); }}

Page 41: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Die Dreischichten-Architektur verlangt, dass die Fachklassen

"stumm" sind. Nur die Klassen, die sich mit der Oberfläche

beschäftigen, sollen die Eingabe und Ausgabe bewerkstelligen.

Page 42: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Welche Methode verletzt die Dreischichten-Architektur ?

printGeoForm()

Page 43: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Diese Methode bringt einen Text auf den Bildschirm. Sie soll aber keinen Text auf den

Bildschirm bringen. Das soll in der Klasse geschehen, wo sich die Methode main(...) befindet.

Page 44: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Die Methode printGeoForm soll den Text als Zeichenkette über einen output-Parameter zurückgeben. Entweder über

return, oder über einen Parameter in printGeoForm(...)

Page 45: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Aufgabe:Schreiben Sie ein Java-Programm, in dem die Methode printGeoForm den Text als Zeichenkette über einen output-Parameter zurückgibt. Entweder über return, oder über einen Parameter in printGeoForm(...).In main(...) soll dann der Text mit System.out.println(...) auf dem Bildschirm ausgegeben werden. Verwenden Sie dazu die entsprechenden Methoden der Klasse String, bzw. StringBuffer.

Page 46: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Bemerkung:In den folgenden Lösung sind die wesentlichen Teile (d.h. die Teile des Programms, die sich vom vorhergehenden unterscheiden), rot markiert.

Page 47: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Lösung mit return:

Page 48: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

public class MainPoly3 { public static void main(String[] args){ int i; double zufall; String str; GeoForm[] feld; feld=new GeoForm[3]; for(i=0;i<3;i++){ zufall = Math.random(); if (zufall<0.5){ feld[i] = new Kreis(2); }

Page 49: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

else{ feld[i] = new Rechteck(10,20); } } for(i=0;i<3;i++){ str=feld[i].getGezGF(); System.out.println(str); } }}

Abkürzung für:getGezeichnetGeoForm

Page 50: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

class GeoForm { public String getGezGF(){ return(null); }}

Page 51: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

class Rechteck extends GeoForm{ private double laenge; private double breite;

public Rechteck(double plaenge, double pbreite){ setLaenge(plaenge); setBreite(pbreite); }

public void setLaenge(double plaenge){ laenge = plaenge; }

Page 52: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

public void setBreite(double pbreite){ breite = pbreite; }

public double getLaenge(){ return(laenge); }

public double getBreite(){ return(breite); }

Page 53: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

public String getGezGF(){ String str1, str2, str3; str1="Rechteck mit Laenge= "+Double.toString(getLaenge()); str2=" und Breite= "+Double.toString(getBreite()); str3=str1+str2; return(str3); }}

Page 54: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

class Kreis extends GeoForm{ private double radius;

public Kreis(double pradius){ setRadius(pradius); }

public void setRadius(double pradius){ radius = pradius; }

Page 55: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

public double getRadius(){ return(radius); }

public String getGezGF(){ String str; str="Kreis mit Radius= "+Double.toString(getRadius()); return(str); }}

Page 56: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

Lösung mit Parameter:

Page 57: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

public class MainPoly4 { public static void main(String[] args){ int i; double zufall; StringBuffer myStringbuf = new StringBuffer(); GeoForm[] feld; feld=new GeoForm[3]; for(i=0;i<3;i++){ zufall = Math.random(); if (zufall<0.5){ feld[i] = new Kreis(2); }

Page 58: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

else{ feld[i] = new Rechteck(10,20); } } for(i=0;i<3;i++){ feld[i].getGezGF( myStringbuf); System.out.println( myStringbuf.toString()); } }}

Page 59: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

class GeoForm { public void getGezGF(StringBuffer ps){ }}

Page 60: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

class Rechteck extends GeoForm{ private double laenge; private double breite;

public Rechteck(double plaenge, double pbreite){ setLaenge(plaenge); setBreite(pbreite); }

public void setLaenge(double plaenge){ laenge = plaenge; }

Page 61: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

public void setBreite(double pbreite){ breite = pbreite; }

public double getLaenge(){ return(laenge); }

public double getBreite(){ return(breite); }

Page 62: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

public void getGezGF( StringBuffer ps){ StringBuffer buf; String str1, str2, str3, str4; ps.setLength(0); str1="Rechteck mit Laenge= "+Double.toString(getLaenge()); str2=" und Breite= "+Double.toString(getBreite()); str3=str1+str2; buf=new StringBuffer(str3); ps.append(buf); }}

Page 63: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

class Kreis extends GeoForm{ private double radius;

public Kreis(double pradius){ setRadius(pradius); }

public void setRadius(double pradius){ radius = pradius; }

public double getRadius(){ return(radius); }

Page 64: Polymorphie (Vielgestaltigkeit). Anschaulich: Ein Amphibienfahrzeug kann verschiedene Gestalten annehmen: - Fahrzeug zu Wasser - Fahrzeug an Land - Fahrzeug

public void getGezGF( StringBuffer ps){ StringBuffer buf; String str; ps.setLength(0); str="Kreis mit Radius= "+Double.toString(getRadius()); buf= new StringBuffer(str); ps.append(buf); }}