Betrachten Sie nochmals die Klasse "Zahl" und die Klasse "Variable":
Zusammen mit der Information, dass sowohl Zahl als auch Variable ein Term ist, lässt sich das UML-Diagramm erweitern:
Diese Darstellung hat den Vorteil, dass die gemeinsame "Abstammung" der Spezies "Zahl" und "Variable" deutlich wird. Betrachten Sie nun die gemeinsamen Eigenschaften der beiden Klassen. Beide besitzen die Methoden als_text() und berechne_wert( belegung ). Da beide von der Klasse "Term" abstammen, kann man sich fragen, ob jede Art von Term die Eigenschaften als_text() und berechne_wert( belegung ) besitzen sollte.
Und tatsächlich sind dies Methoden, die jede "Abstammung" von Term haben muss, denn sie charakterisieren die wesentlichen Merkmale eines Terms: er muss darstellbar sein, und eine Termbelegung muss zu einer Zahl führen!
Deshalb wird jeder Klasse, die ein Term sein will in Zukunft vorgeschrieben, diese Methoden zu besitzen. In Java wird nun als Vorfahr die abstrakte Klasse "Term" eingeführt:
abstract class Term {
public abstract double berechne_wert( double belegung[] );
public abstract String als_text();
}
Sie werden niemals direkt ein Objekt der Klasse "Term" erzeugen. Aber sie wissen stets, wenn sie ein Objekt erzeugen, das von "Term" abstammt, dass es die beiden Methoden besitzt und implementieren muss.
Machen wir nun die Klassen "Zahl" und "Variable" zu Nachfahren der Klasse "Term":
class Zahl extends Term{
...
}
class Variable extends Term{
...
}
Die gesamte Klassendefinition bleibt erhalten, auch in der "main"-Routine ändert sich nichts. Die vollständige Darstellung im UML-Diagramm schaut dann so aus:
Aufgabe:
- Erzeugen Sie aus dem dargestellten UML-Diagramm eine abstrakte Klasse "Funktion". Sie wird für die nächste Station benötigt.