5. Abstrakte Klassen Beispiel (2) Beispiel (3) Abstrakte Klasse

Werbung
5. Abstrakte Klassen
Beispiel
5. Abstrakte Klassen
5. Abstrakte Klassen
Beispiel
Beispiel (3)
Angenommen, wir wollen die folgende Klassenhierarchie implementieren:
Probleme des Implementierungsvorschlags:
Vogel
(1) In der Realität gibt es keinen Vogel, der “nur” ein Vogel ist.
Konsequenz: Nur für die Unterklassen sollte eine Instanziierung möglich sein.
+ singe()
(2) Ein Programmierer erweitert die Klassenhierarchie um die Klasse Star und vergisst dabei, die Methode singe() zu überschreiben.
Dann haben Stare keine Stimme.
Amsel
Drossel
Fink
+ singe()
+ singe()
+ singe()
(3) Wenn (1) erfüllt ist und der Fehler von (2) nicht vorliegt, dann wird die Methode
singe() in der Klasse Vogel nie aufgerufen.
Wir können Sie aber auch nicht einfach weglassen. Warum nicht?
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
5. Abstrakte Klassen
138
Beispiel
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
5. Abstrakte Klassen
Abstrakte Klasse
Abstrakte Klasse
Beispiel (2)
Vorschlag zur Implementierung:
• Problem (1) können wir lösen, indem wir eine Klasse als abstrakt kennzeichnen.
• Zugehöriges Schlüsselwort: abstract
public class Vogel {
public void singe() { System.out.println( "Vogel singt: ..."); }
}
public abstract class Klassenname ... { ... }
public class Amsel extends Vogel {
public void singe() { System.out.println( "Amsel singt: uiuiii..."); }
}
public class Drossel extends Vogel {
public void singe() { System.out.println( "Drossel singt: zwawaaa..."); }
}
• Von abstrakten Klassen können keine Instanzen erzeugt werden.
• Konsequenz: Um Objekte erzeugen zu können, muss mindestens eine Unterklasse
zur abstrakten Klasse definiert werden, die nicht mehr abstrakt ist.
Für unser Beispiel:
public class Fink extends Vogel {
public void singe() { System.out.println( "Fink singt: zrzrrr..."); }
}
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
140
• Wenn wir die Klasse Vogel als abstrakt kennzeichnen, können wir nur noch Amseln, Drosseln oder Finken instanziieren.
139
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
141
5. Abstrakte Klassen
Abstrakte Klasse
5. Abstrakte Klassen
Abstrakte Methoden
Abstrakte Methoden
Abstrakte Klasse (2)
Zur Lösung der Probleme (2) und (3) erklären wir die Methode singe() in der Klasse
Vogel zu einer abstrakten Methode.
Bemerkungen:
• Eine abstrakte Klasse kann Unterklasse einer nicht abstrakten Klasse sein.
• Eine abstrakte Klasse kann weitere abstrakte Klassen als Unterklassen haben.
• Auch für abstrakte Klassen sollten Konstruktoren definiert werden.
Grund: Die Initialisierung von Objekten erfolgt entlang der Klassenhierarchie (siehe
Beispiel zu geometrischen Objekten).
• Eine Klasse kann nicht gleichzeitig final und abstrakt sein.
Konsequenz: Der Compiler verbietet die Kombination von abstract und final
im Klassenkopf.
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
142
5. Abstrakte Klassen
Abstrakte Klasse
• Die Definition einer abstrakten Methode besteht aus einer Methodensignatur ohne
einen Rumpf.
• Statt eines Blocks als Rumpf folgt dem Methodenkopf ein Semikolon.
• Solch eine Methode wird mit dem Schlüsselwort abstract markiert.
• Damit haben wir Problem (3) gelöst: Wir brauchen keine Dummy-Implementierung
mehr für die Methode singe().
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
5. Abstrakte Klassen
Abstrakte Klasse in UML
144
Abstrakte Methoden
Abstrakte Methoden (2)
Im UML-Klassendiagramm werden abstrakte Klassen durch einen kursiven Klassennamen gekennzeichnet.
Syntax:
Vogel
Modifikator abstract Datentyp Methodenname(Parameterliste);
+ singe()
Beispiel: Abstrakte Klasse mit einer abstrakten Methode:
public abstract class Vogel {
public abstract void singe();
}
Amsel
Drossel
Fink
+ singe()
+ singe()
+ singe()
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
143
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
145
5. Abstrakte Klassen
Abstrakte Methoden
5. Abstrakte Klassen
Abstrakte Methoden (3)
Abstrakte Methoden
Zusammenspiel: Abstrakte Klassen und Methoden
Die Definition einer abstrakten Methode m in einer Klasse K bedeutet:
K k = new U();
• Abstrakte Klassen dürfen abstrakte Methoden anbieten.
• Jede Klasse, die mindestens eine (evtl. geerbte) abstrakte Methode hat, ist selbst
abstrakt und muss entsprechend deklariert werden.
• Damit eine Unterklasse einer abstrakten Klasse eine konkrete Klasse werden
kann, muss sie Implementierungen für alle geerbten abstrakten Methoden anbieten.
• Andernfalls ist die Unterklasse selbst abstrakt und muss als solche gekennzeichnet
werden.
k.m();
Damit haben wir Problem (2) gelöst:
• Für die Klasse K und somit auch für alle Unterklassen U von K ist die Methode
m bekannt.
• K möchte/kann die Methode nicht implementieren. Dies muss in einer Unterklassen U von K erfolgen.
• Sei U eine (nicht abstrakte) Unterklasse von K . Dann ist folgendes möglich.
• Wenn der Programmierer der Klasse Star vergessen sollte, die Methode
singe() zu überschreiben, meldet der Compiler einen Fehler.
• Die Methodenauswahl basiert auf dem dynamischen Typ von k.
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
146
5. Abstrakte Klassen
Abstrakte Methoden
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
5. Abstrakte Klassen
Abstrakte Methoden in UML
148
Abstrakte Methoden
Wann setzt man abstrakte Klassen ein?
Im UML-Klassendiagramm werden abstrakte Methoden durch eine kursive Schreibweise gekennzeichnet.
Vogel
+ singe()
•
•
•
•
Zur Repräsentation einer Generalisierung verschiedener Klassen,
die Eigenschaften der gleichen Art haben,
die in den Unterklassen aber unterschiedlich berechnet werden müssen.
Für die Berechnung der Eigenschaften sehen wir in der Generalisierung jeweils
eine abstrakte Methode vor, um deutlich zu machen, dass Objekte dieser Klasse
(und der Unterklasse) diese Eigenschaften haben.
• Die jeweilige Art und Weise der Berechnung wird aber erst in den Unterklassen
festgelegt.
Amsel
Drossel
Fink
+ singe()
+ singe()
+ singe()
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
147
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
149
5. Abstrakte Klassen
Weitere Beispiele
5. Abstrakte Klassen
Beispiel: Roboter mit spezialisiertem Verhalten
Weitere Beispiele
Beispiel: Geometrische Objekte und deren Eigenschaft Fläche
GeoObjekt
double x
double y
• Übungsaufgabe der kommenden Woche.
• Roboter mit Positionsbestimmung in ganzzahligem Koordinatensystem
• Steuerungsmöglichkeiten für solche Roboter: Einen Schritt in aktuelle Richtung,
Änderung der Richtung durch Drehung um 90 Grad nach links bzw. rechts.
• In Unterklassen soll für die Roboterklassen ein spezifisches Verhalten festgelegt
werden: Sie erhalten einen Auftrag.
• Zugehörige Methode: bewegeDich()
• Torkelnder Roboter: Ziellos, zufällige Schritte und Drehungen
• Wächter: Geht ein vorgegebenes Rechteck ab.
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
5. Abstrakte Klassen
150
Weitere Beispiele
Beispiel: Roboter mit spezialisiertem Verhalten (2)
double gibX()
double gibY()
void verschiebe(double,double)
double berechneFlaeche()
Rechteck
Kreis
double breite
double hoehe
double radius
double berechneFlaeche()
double berechneFlaeche()
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
5. Abstrakte Klassen
152
Weitere Beispiele
Beispiel: Geometrische Objekte und deren Eigenschaft Fläche (2)
Roboter
public abstract class GeoObjekt {
int gibX()
int gibY()
void macheSchritt()
void dreheLinks()
void dreheRechts()
void bewegeDich()
TorkelnderRoboter
private double x;
private double y;
public GeoObjekt(double x, double y) {
this.x = x;
this.y = y;
}
...
public abstract double berechneFlaeche();
WächterRoboter
}
void bewegeDich()
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
void bewegeDich()
151
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
153
5. Abstrakte Klassen
Weitere Beispiele
Beispiel: Geometrische Objekte und deren Eigenschaft Fläche (2)
public class Rechteck extends GeoObjekt {
private double hoehe;
private double breite;
public Rechteck(double x, double y, double hoehe, double breite) {
super(x,y);
this.hoehe = hoehe;
this.breite = breite;
}
public double berechneFlaeche() {
return this.hoehe*this.breite;
}
}
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
5. Abstrakte Klassen
154
Weitere Beispiele
Beispiel: Geometrische Objekte und deren Eigenschaft Fläche (3)
public class Kreis extends GeoObjekt {
private double radius;
public Kreis(double x, double y, double radius) {
super(x,y);
this.radius = radius;
}
public double berechneFlaeche() {
return Math.PI * this.radius * this.radius;
}
}
Peter Becker, Programiersprache Java — FH Bonn-Rhein-Sieg, SS 08
155
Herunterladen