Fachkonzept - Abstrakte Klassen
Klassen ohne konkrete Objekte
In einigen Fällen ist es nicht sinnvoll, wenn man von einer Klasse direkt Objekte erzeugen kann. Um dies zu verhindern kann man eine Klasse als abstrakt definieren. Objekte kann man dann nur von einer nicht abstrakten Unterklasse erzeugen, nicht aber von der abstrakten Klasse selbst.
Zusätzlich zu den gewöhnlichen Methoden, die man in diesem Zusammenhang auch konkrete Methoden nennt, können abstrakte Methoden definiert werden. Die Besonderheit an abstrakten Methoden ist, dass sie nur die Schnittstelle einer Methode definieren, nicht aber deren Implementierung. Es wird also nur festgelegt, welchen Namen, welche Parameter und welchen Rückgabetyp eine Methode hat. Es wird aber nicht festgelegt, wie die Methode ihre Aufgabe erledigt. Eine Unterklasse muss dann, außer sie ist selbst wieder abstrakt, alle abstrakten Methoden der Oberklasse implementieren.
Soll z.B. ein Grafiksystem programmiert werden, das geometrische Formen wie Kreise
und Rechtecke
enthält,
ist es sinnvoll die Klassen Kreise
und Rechtecke
als Unterklassen von
GeometrischeFigur
zu definieren.
Es macht keinen Sinn direkt ein Objekt der Klasse GeometrischeFigur
zu erzeugen,
also verbietet man dies, indem man die Klasse als abstrakt definiert.
Jede geometrische Figur besitzt eine Farbe, die in einem Attribut gespeichert werden soll. Da das Setzen und Erfragen der Farbe für alle geometrischen Figuren gleich funktioniert, können die entsprechenden get- und set-Methoden in der Klasse als konkrete Methoden implementiert werden.
Außerdem soll jede geometrische Figur ihre Fläche berechnen können.
Die genaue Implementierung kann aber in der Klasse GeometrischeFigur nicht angegeben werden,
da diese für jede Unterklasse unterschiedlich lauten muss. Man definiert die Methode berechneFläche also als abstrakt.
Dies bietet den Vorteil, dass eine Variable vom Typ GeometrischeFigur
einen Kreis oder Rechteck enthalten kann.
Da beide die Methode berechneFlaeche
implementieren, kann man diese auch aufrufen.
Ausgeführt wird aber die jeweils in Kreis
oder Rechteck
definierte Methode.
UML-Darstellung
Im Klassendiagramm werden Namen von abstrakten Klasse und abstrakten Methoden kursiv dargestellt. Alternativ ist es auch erlaubt unterhalb des Klassennamens die Bezeichnung {abstract} anzugeben, wenn die kursive Darstellung schlecht lesbar ist.
Java-Code
Sobald eine Klasse eine abstrakte Methode enthält, muss sie in Java als abstrakt definiert werden. Abstrakte Methoden müssen von einer Unterklasse implementiert werden. Ansonsten muss die Unterklasse selbst wieder abstrakt sein. Der Quellcode für obiges Beispiel lautet dann:
public abstract class GeometrischeFigur {
private Color farbe;
// Abstrakte Methode OHNE Methodenrumpf
public abstract double berechneFlaeche();
// Konkrete Methoden
public void setColor(Color neueFarbe) {
farbe = neueFarbe;
}
public Color getColor() {
return farbe;
}
}
public class Kreis extends GeometrischeFigur {
private double radius;
// Implementierung der abstrakten Methode der Oberklasse
public double berechneFlaeche(){
return 2 * Math.PI * radius * radius;
}
}
public class Rechteck extends GeometrischeFigur {
private double hoehe;
private double breite;
// Implementierung der abstrakten Methode der Oberklasse
public double berechneFlaeche(){
return hoehe * breite;
}
}