Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Kritische Betrachtung

Ähnliche Präsentationen


Präsentation zum Thema: "Kritische Betrachtung"—  Präsentation transkript:

1 Kritische Betrachtung
Bisher implementiert: Listen für Werte des Typs int über Elemente der Klasse intElement Liste für double Liste für Studierende Liste von Listen von int erfordern jeweils neue, fast identische Implementierung der Klassen für Elemente und Liste.

2 Kritische Betrachtung (Fortsetzung)
Analyse: Elemente haben immer Referenzen auf Nachfolger (und Vorgänger). Liste verknüpft, löscht und durchläuft immer Elemente. Elemente unterscheiden sich im Typ der abgelegten Werte. Liste benötigt möglicherweise typspezifische Vergleiche. Idee: Elemente und Liste allgemein formulieren und anschließend nur an wenigen Stellen spezialisieren.

3 Vererbung Spezialisierung von Klassen in JAVA möglich durch Konzept der Vererbung

4 Vererbung Wenn eine Klasse A die Klasse B spezialisiert,
also die Klasse A von der Klasse B erbt, übernimmt sie alle Attribut- und Methoden-Deklarationen von B. A heißt dann Unterklasse von B oder Subklasse von B B heißt dann Oberklasse von A oder Superklasse von A

5 Vererbung Oberklasse Unterklasse

6 Vererbung Beispiel: public class Person {
private String name, vorname, wohnort; public Person(String n, String v, String w) { name = n; vorname = v; wohnort = w; } public String toString() { return name + ", " + vorname

7 Vererbung Beispiel: public class Person {
private String name, vorname, wohnort; public Person(String n, String v, String w) { name = n; vorname = v; wohnort = w; } public String toString() { return name + ", " + vorname public class Kunde extends Person {{ private int nummer;

8 Vererbung Beispiel: public class Person {
private String name, vorname, wohnort; public Person(String n, String v, String w) { name = n; vorname = v; wohnort = w; } public String toString() { return name + ", " + vorname public class Kunde extends Person { private int nummer;

9 + Vererbung Beispiel: public class Person {
private String name, vorname, wohnort; public Person(String n, String v, String w) { name = n; vorname = v; wohnort = w; } public String toString() { return name + ", " + vorname public class Kunde extends Person { private int nummer; +

10 Vererbung bedeutet: public class Kunde extends Person {{
private int nummer; } bedeutet: Kunde wird als Unterklasse von Person definiert. Person wird dadurch Oberklasse von Kunde. Kunde hat geerbt: die öffentliche Methode toString, die privaten Attribute name, vorname und wohnort. In Kunde wird definiert: das private Attribut nummer.

11 Vererbung Person Kunde

12 Vererbung Was bringt Vererbung?

13 Vererbung Was bringt Vererbung? verringerten Schreibaufwand
Gleichförmigkeit reduzierten Änderungsaufwand vereinfachtes Testen aber auch: ständiges Beachten der gegenseitigen Abhängigkeiten

14 Fragen Was geht wie in der Klasse Kunde?
Zugriff auf die geerbten privaten Attribute name, vorname und wohnort, z.B. Definition eines Konstruktors für alle vier Attribute, z.B. gemeinsamer Text aus einigen Attributen, z.B. gemeinsamer Text aus allen Attributen, Zulässigkeit von Referenzen auf Ober- und Unterklasse.

15 Vererbung – Konstruktor in Unterklasse
Beispiel: public class Person { private String name, vorname, wohnort; public Person(String n, String v , String w) { name = n; … } public String toString() { return name + ", " + vorname } } public class Kunde extends Person { private int nummer;

16 Vererbung – Konstruktor in Unterklasse
Beispiel: public class Person { private String name, vorname; public Person(String n, String v , String w) { name = n; … } public String toString() { return name + ", " + vorname } } public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { name = n; vorname = v; wohnort = w; nummer = n;

17 Vererbung – Konstruktor in Unterklasse
Beispiel: public class Person { private String name, vorname; public Person(String n, String v , String w) { name = n; … } public String toString() { return name + ", " + vorname } } public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { name = n; nicht erlaubt, da private in Oberklasse vorname = v; nicht erlaubt, da private in Oberklasse wohnort = w; nicht erlaubt, da private in Oberklasse nummer = n;

18 Vererbung – Konstruktor in Unterklasse
Beispiel: public class Person { private String name, vorname, wohnort; public Person(String n, String v , String w) { name = n; … } public String toString() { return name + ", " + vorname } } public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { super(n, v, w); Aufruf des Konstruktors erlaubt, da public nummer = n;

19 Vererbung – Texterzeugung in Unterklasse
Beispiel: public class Person { private String name, vorname, wohnort; public Person(String n, String v , String w) { name = n; …} public String toString() { return name + ", " + vorname } } public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { super(n, v, w); nummer = n; public String ???() { return ??? + ", " + nummer;

20 Vererbung – Texterzeugung Version 1
Beispiel: public class Person { private String name, vorname, wohnort; public Person(String n, String v , String w) { name = n; … } public String toString() { return name + ", " + vorname } } public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { super(n, v, w); nummer = n; public String zuText() { return toString() + ", " + nummer;

21 Vererbung – Texterzeugung Version 2
Fragen: Ist Überdefinieren einer Methode in der Unterklasse möglich, also toString() in Ober und Unterklasse? Und: Wie wird dann der Namenskonflikt gelöst, um beide Versionen von toString() zu unterscheiden?

22 Vererbung – toString in Unterklasse
Beispiel: public class Person { private String name, vorname, wohnort; public Person(String n, String v, String w) { name = n; … } public String toString() { return name + ", " + vorname } } public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { super(n, v, w); nummer = n; public String toString() { return super.toString() + ", " + nummer;

23 Vererbung – toString in Unterklasse
Zusammenfassung: super(…) bezeichnet den Konstruktor der Oberklasse. Überdefinieren von Methoden in Unterklassen ist möglich. super. … erlaubt den Zugriff auf Komponenten der Oberklasse.

24 Erweiterung der Klasse Kunde
Problem: Gewünscht ist Methode in Kunde, die wohnort ändern kann, wenn zugleich die richtige Kundenummer angegeben wird.

25 Erweiterung der Klasse Kunde
Problem: Gewünscht ist Methode in Kunde, die wohnort ändern kann, wenn zugleich die richtige Kundenummer angegeben wird. Lösung: Erweiterung der Klasse Person um die Methoden gibOrt() und setzeOrt(String w) aber: Nur die Unterklasse soll Änderung durchführen können, daher private zu wenig und public zuviel.

26 Erweiterung der Klasse Kunde
Problem: Gewünscht ist Methode in Kunde, die wohnort ändern kann, wenn zugleich die richtige Kundenummer angegeben wird. Lösung: Erweiterung der Klasse Person um die Methoden gibOrt() und setzeOrt(String w) daher: Zugriffsrecht protected nutzen Unterklassen dürfen zugreifen, andere Klassen nicht!

27 Überarbeitete Klasse Person
Beispiel: public class Person { private String name, vorname, wohnort; public Person(String n, String v, String w) { name = n; vorname = v; wohnort = w; } public String toString() { return name + ", " + vorname } public String gibOrt() { return wohnort; protected void setzeOrt(String w) { wohnort = w;

28 Überarbeitete Klasse Kunde
Beispiel: public class Kunde extends Person { private int nummer; public Kunde (String n, String v, String w, int n) { super(n, v); nummer = n; } public String toString() { return super.toString() + ", " + nummer; public aendereOrt(int n, String w) { if (nummer == n) wohnort = w;

29 Überarbeitete Klassen
Zusammenfassung: Person erlaubt nur Objekten von erbenden Klassen das Setzen des Ortes: protected void setzeOrt(…) Kunde erlaubt allen Objekten das Ändern des Ortes, sofern die richtige Kundennummer angegeben wird: public void aendereOrt(…)

30 Referenzen auf Ober- und Unterklassen
Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); // Methoden in beiden Klassen vereinbart System.out.println(p.toString()); System.out.println(k.toString());

31 Referenzen auf Ober- und Unterklassen
Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); // Methoden in beiden Klassen vereinbart System.out.println(p.toString()); System.out.println(k.toString()); // Methode aus Person vererbt System.out.println(p.gibOrt()); System.out.println(k.gibOrt());

32 Referenzen auf Ober- und Unterklassen
Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); // Methoden in beiden Klassen vereinbart System.out.println(p.toString()); System.out.println(k.toString()); // Methode aus Person vererbt System.out.println(p.gibOrt()); System.out.println(k.gibOrt()); // Methode nur in Kunde k.aendereOrt(103, “Unna“);

33 Referenzen auf Ober- und Unterklassen
Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); // Methoden in beiden Klassen vereinbart System.out.println(p.toString()); System.out.println(k.toString()); // Methode aus Person vererbt System.out.println(p.gibOrt()); System.out.println(k.gibOrt()); // Methode nur in Kunde k.aendereOrt(103, “Unna“);

34 Referenzen auf Ober- und Unterklassen
Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); // Methoden in beiden Klassen vereinbart System.out.println(p.toString()); System.out.println(k.toString()); // Methode aus Person vererbt System.out.println(p.gibOrt()); System.out.println(k.gibOrt()); // Methode nur in Kunde k.aendereOrt(103, “Unna“); p a k

35 Referenzen auf Ober- und Unterklassen
Folgerung: Da jede öffentliche Methode der Oberklasse auch von jeder Unterklasse bereitgestellt wird, darf eine Referenz der Oberklasse auf Objekte einer Unterklasse verweisen.

36 Referenzen auf Ober- und Unterklassen
Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); p = k; p.aendereOrt(103, “Unna“); System.out.println(p.gibOrt()); System.out.println(p.toString());

37 Referenzen auf Ober- und Unterklassen
Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); p = k; p.aendereOrt(103, “Unna“); System.out.println(p.gibOrt()); System.out.println(p.toString()); Nicht möglich, da p Referenz auf Person und aendereOrt in Person unbekannt ist.

38 Referenzen auf Ober- und Unterklassen
Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); p = k; p.aendereOrt(103, “Unna“); System.out.println(p.gibOrt()); System.out.println(p.toString()); Nicht möglich, da p Referenz auf Person und aendereOrt in Person unbekannt ist.

39 Referenzen auf Ober- und Unterklassen
Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); p = k; p.aendereOrt(103, “Unna“); System.out.println(p.gibOrt()); System.out.println(p.toString()); Unproblematisch, da in Person definiert und in Kunde nur geerbt.

40 Referenzen auf Ober- und Unterklassen
Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); p = k; p.aendereOrt(103, “Unna“); System.out.println(p.gibOrt()); System.out.println(p.toString()); In Person definiert und in Kunde geerbt und überdefiniert, so dass zwei Versionen von toString() bereit stehen. Welche Version wird ausgeführt?

41 Referenzen auf Ober- und Unterklassen
Beispiel: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); p = k; p.aendereOrt(103, “Unna“); System.out.println(p.gibOrt()); System.out.println(p.toString()); Welche Version wird ausgeführt? Das Objekt entscheidet, nicht die Referenz: Da hier ein Kunde-Objekt, wird toString() aus Kunde aufgerufen.

42 Vererbung Person Kunde Aufruf einer Methode

43 Referenzen auf Ober- und Unterklassen
Zusammenfassung: Der Typ der Referenz bestimmt, welche Methoden über diese Referenz überhaupt aufgerufen werden dürfen. Wenn eine Methode über eine Referenz aufgerufen werden kann, dann wird immer die in oder am nächsten vor der Klasse des Objekts definierte Version ausgeführt.

44 Referenzen auf Ober- und Unterklassen
Zusammenfassung: Der Typ der Referenz bestimmt, welche Methoden über diese Referenz überhaupt aufgerufen werden dürfen. Wenn eine Methode über eine Referenz aufgerufen werden kann, dann wird immer die in oder am nächsten vor der Klasse des Objekts definierte Version ausgeführt. Polymorphie

45 Referenzen auf Ober- und Unterklassen
Beispiel – es geht auch wieder zurück: Person p = new Person (“Meier“, “Jana“, “Dortmund“); Kunde k = new Kunde (“Schmidt“, “Axel“, “Bochum“, 103); p = k; System.out.println(p.gibOrt()); System.out.println(p.toString()); k = (Kunde)p; expliziter Type-Cast: Der Programmierer versichert dem Programm, dass p auf ein Objekt der Klasse Kunde verweist.

46 Referenzen auf Ober- und Unterklassen
Wofür das Ganze?

47 Referenzen auf Ober- und Unterklassen
Wofür das ganze Referenzierungskonzept? Es lassen sich Algorithmen formulieren, die nicht wissen müssen, mit welcher Art von Unterklassen-Objekten sie bei der Ausführung tatsächlich umgehen. Beispiel: Liste, die nicht weiß, ob int-Werte oder Kunden-Objekte aufgelistet werden.

48 Referenzen auf Ober- und Unterklassen
Wofür das ganze Referenzierungskonzept? Es lassen sich Algorithmen formulieren, die nicht wissen müssen, mit welcher Art von Unterklassen-Objekten sie bei der Ausführung tatsächlich umgehen. Und: Objekte verschiedener Klassen können gemeinsam verarbeitet werden. Beispiel: Objekte der Klassen Kunde und Lieferant bei Weihnachtsgrüßen.

49 Referenzen auf Ober- und Unterklassen
Beispiel: public class Lieferant extends Person { }

50 Referenzen auf Ober- und Unterklassen
Beispiel: public class Lieferant extends Person { } Lieferant ist eine weitere Unterklasse von Person.

51 Unterklassen von Unterklassen
Beispiel: public class Goldkunde extends Kunde { private String geschenk; }

52 Unterklassen von Unterklassen
Beispiel: public class Goldkunde extends Kunde { private String geschenk; } Goldkunde ist jetzt: (direkte) Unterklasse von Kunde und zugleich eine weitere Unterklasse von Person

53 Klassenhierarchie Person Kunde Lieferant Goldkunde

54 Anmerkungen zum Vererbungskonzept
Jede Klasse hat höchstens eine Oberklasse: public class Goldkunde extends Kunde { private String geschenk; } (Die Syntax erlaubt hier keine Liste!)

55 Anmerkungen zum Vererbungskonzept
Jede Klasse hat höchstens eine Oberklasse: public class Goldkunde extends Kunde { private String geschenk; } (Die Syntax erlaubt hier keine Liste!) Es entstehen immer Vererbungsbäume!

56 Anmerkungen zum Vererbungskonzept
Jede selbst definierte Klasse hat eine explizite Oberklasse oder die implizite Oberklasse Object: public class Person extends Object { }

57 Anmerkungen zur Syntax
Jede selbst definierte Klasse hat eine explizite Oberklasse oder die implizite Oberklasse Object: public class Person extends Object { } Alle Klassen bilden einen Vererbungsbaum mit der Wurzel Object!

58 Anmerkungen zum Vererbungskonzept
Jede selbst definierte Klasse hat eine explizite Oberklasse oder die implizite Oberklasse Object: public class Person extends Object { } Alle Klassen bilden einen Vererbungsbaum mit der Wurzel Object! Referenzen der Klasse Object können auf jedes Objekt verweisen.

59 Klassenhierarchie Object Person Kunde Lieferant Goldkunde


Herunterladen ppt "Kritische Betrachtung"

Ähnliche Präsentationen


Google-Anzeigen