Script Java

Script Java Script Java

29.01.2014 Aufrufe

8.1 Abstrakte Methoden und Klassen abstract public class NumberSystem{ abstract int toInt(String s); abstract String toString(int value); } Da die Methoden toInt() und toString() in der Klasse NumberSystem abstrakt sind, ist es plausibel, dass die Klasse NumberSystem nicht instanziert werden kann. Aus dem Programm ist aber auch zu entnehmen, dass die Klasse ArabicSystem ebenfalls eine abstrakte Klasse ist, obwohl sie keine abstrakte Methoden deklariert 1 . Es ist möglich, eine Klasse als abstract zu deklarieren, auch wenn diese keine abstrakten Methoden enthält. Hierdurch lässt sich eine Instanzierung verhindern. Im Beispiel können lediglich die Unterklassen der Klasse ArabicSystem instanziert werden. Da erst in den Unterklassen die bereits in der Oberklasse deklarierte Instanzvariable radix initialisiert wird, wäre eine Instanzierung von ArabicSystem wenig sinnvoll. Die Klasse NumberField, eine Unterklasse von TextField, wird für die Textfelder der graphischen Benutzeroberfläche verwendet. Sie deklariert Methoden, um den int- Wert einer Zahl, welche der Benutzer eingegeben hat, zu ermitteln oder eine Zahl als String im GUI anzuzeigen. Andererseits ermöglicht sie auch die Repräsentation der Zahlen in den unterschiedlichen Zahlenformaten. Nach eingehender Betrachtung merkt man aber, dass die besagten Methoden lediglich die Methoden toInt() und toString() aufrufen. Der Empfänger numberSystem der Botschaften toInt() und toString() wird als Instanz der Klasse NumberSystem deklariert und referenziert immer eine Instanz derjenigen „Zahlensystem-Klasse“, welche momentan in der Choice selektiert ist 2 . Entscheidend dabei ist, dass numberSystem vom Typ NumberSystem deklariert wurde, da hierdurch eine konversionslose Zuweisung gewährleistet ist. Hätte man numberSystem als Instanz der Klasse DecNumber deklariert, so könnte man ihr nicht eine Instanz der Klasse RomanNumber zuweisen, da ein type cast erforderlich wäre. Dies illustriert auch einen weiteren Vorteil für die Verwendung von abstrakten Methoden bzw. Klassen: Deren Einsatz zwingt den Programmierer, bereits auf höherer Hierarchiestufe die Signatur von weiter unten implementierten Methoden festzulegen, 1 Die Unterscheidung zwischen abstrakten Klassen und nicht-abstrakten Klassen wird im Programm zusätzlich noch durch den Identifier unterstrichen: abstrakte Klassen werden als ∼System und sonstige Klassen als ∼Number bezeichnet. 2 In der Klasse UserFrame wird ein Array base verwendet, welcher gewissermassen „auf Vorrat“ Instanzen der fünf „Zahlensystem-Klassen“ enthält. Eine solche Instanz wird der Klasse NumberField einerseits zu Programmbeginn durch Aufruf ihres Konstruktors und andererseits durch die Methode changeBase() übergeben. 210

8.1 Abstrakte Methoden und Klassen wodurch deren Zugriff vereinheitlicht wird. Es ist beispielsweise möglich, in der Klasse NumberField lediglich den Aufruf numberSystem.toInt() zu setzen. Die virtuelle Maschine ruft dann diejenige Methode auf, welche in der Klasse der jeweiligen Instanz deklariert ist. Hätte man keine abstrakten Methoden deklariert und würde zusätzlich die Signatur der jeweiligen Methoden in den Klassen ArabicSystem und RomanNumber unterschiedlich ausfallen, müsste in der Klasse NumberField für jede Instanz der Methodenaufruf separat gemacht werden. Siehe auch: 8.1.2.2 8.1.2 Syntax 8.1.2.1 Abstrakte Methoden Eine abstrakte Methode deklariert lediglich die Signatur der Methode, nicht aber deren Rumpf. Die Deklaration verwendet das Schlüsselwort abstract und wird mit einem Semikolon abgeschlossen. AbstractMethod abstract type Identifier(ParameterList); Beispiele: abstract int toInt(String s); abstract String toString(int value); Abstrakte Methoden werden an Unterklassen weitervererbt. Eine Unterklasse, welche einen Methodenrumpf für eine abstrakte Methode deklariert, implementiert diese. 8.1.2.2 Abstrakte Klassen Abstrakte Klassen werden mit dem Schlüsselwort abstract bezeichnet und können nicht instanziert werden. 211

8.1 Abstrakte Methoden und Klassen<br />

wodurch deren Zugriff vereinheitlicht wird. Es ist beispielsweise möglich, in der Klasse<br />

NumberField lediglich den Aufruf numberSystem.toInt() zu setzen. Die<br />

virtuelle Maschine ruft dann diejenige Methode auf, welche in der Klasse der jeweiligen<br />

Instanz deklariert ist. Hätte man keine abstrakten Methoden deklariert und würde<br />

zusätzlich die Signatur der jeweiligen Methoden in den Klassen ArabicSystem und<br />

RomanNumber unterschiedlich ausfallen, müsste in der Klasse NumberField für jede<br />

Instanz der Methodenaufruf separat gemacht werden.<br />

Siehe auch: 8.1.2.2<br />

8.1.2 Syntax<br />

8.1.2.1 Abstrakte Methoden<br />

Eine abstrakte Methode deklariert lediglich die Signatur der Methode, nicht aber deren<br />

Rumpf. Die Deklaration verwendet das Schlüsselwort abstract und wird mit einem<br />

Semikolon abgeschlossen.<br />

AbstractMethod<br />

abstract type Identifier(ParameterList);<br />

Beispiele: abstract int toInt(String s);<br />

abstract String toString(int value);<br />

Abstrakte Methoden werden an Unterklassen weitervererbt. Eine Unterklasse, welche<br />

einen Methodenrumpf für eine abstrakte Methode deklariert, implementiert diese.<br />

8.1.2.2 Abstrakte Klassen<br />

Abstrakte Klassen werden mit dem Schlüsselwort abstract bezeichnet und können<br />

nicht instanziert werden.<br />

211

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!