Welchen Sinn haben abstrakte Methoden?

Jack159

Bekanntes Mitglied
Ich lerne gerade Java und bin momentan beim Thema "Vererbung, Polymorphie, Interfaces...".
Meiner Meinung nach ein etwas komplexeres Thema.

Im Buch ist die rede von "Abstrakten Methoden", welche etwa so aussehen:

Java:
public abstract double preis();

Abstrakte Methoden zeichnen sich ja dadurch aus, dass diese keinen Body haben.
Bei normalen Methoden, welche einen Body haben, würden im Body ja dann irgednwelche Anweisungen stehen, die diese Methode ausführt.
z.b.
Java:
public double preis() {
x = y+1
}

Welchen Sinn hat aber jetzt eine abstrakte Methode, welche garkeine Anweisungen ausführt?
Wozu schreibt man diese überhaupt auf? Da kann man die doch gleich weglassen, oder?
 
Hallo Jack,

der Sinn von abstrakten Methoden liegt in ihrer Abstraktion. Nehmen wir an, dass Du eine Klasse MediaPlayer schreibst, die einfach eine Musikdatei abspielen kann.
Wie wir alle wissen gibt es jetzt sehr unterschiedliche Musikdateien, manche nutzen MP3, andere mögen OGG und wieder andere vielleicht WMA.

Das Abspielen von Musik ist jetzt zu einem großen Teil gleich, man lädt die Datei, wertet die Tags aus, dekodiert den Datenstrom in etwas, das direkt abgespielt werden soll.
Hier gehen wir mal vereinfachend davon aus, dass nur die Kodierung (MP3, OGG oder WMV) sich unterscheidet. Dann bietet es sich an, dass Du nicht Drei Klassen Mp3Spieler, OggSpieler und WmvSpieler so schreibst, dass die sich 80%-90% des Codes teilen, sondern eine gemeinsame Basis nutzt. In dieser Basis-Klasse MediaPlayer schreibst alle Methoden zum öffnen der Datei und auslesen der Tags und siehst eine abstrakte Methode decode vor, die eben den Datenstrom dekodiert.
Die kannst Du in der Basisklasse auch schon verwenden, der Code für das Abspielen steht also schon, obwohl Du den noch gar nicht kennst.
Für jedes unterstützte Format musst Du jetzt nur noch diese eine Methode implementieren und kann die entsprechende Klasse verwenden.

Warum ist das gut? Einerseits sparst Du Dir das Copy&Paste beim Erzeugen der Klassen. Wichtiger ist aber, dass Du auch die Wartbarkeit deutlich verbesserst. Möchtest Du z.B. noch auf der Konsole ausgeben, welcher Song jetzt gespielt wird, dann kannst Du das an einer Stelle in der Basisklasse ändern und musst nicht in die drei Dateien rein. Letzteres ist der Nachteil an C&P Lösungen, Du musst in zig-Dateien und übersiehst schnell eine Stelle.
 
Ich hab mir das eben durchgelesen und jetzt ist es glaube ich etwas klarer.
In der Superklasse kommen also abstrakte Methoden rein, welche jede Unterklasse erbt.
Sollte eine Unterklasse eine dieser abstrakten Methoden brauchen, dann erhält diese Methode erst in der Unterklasse einen Body.
 
In der Superklasse kommen also abstrakte Methoden rein, welche jede Unterklasse erbt.

Das ist soweit korrekt, vor allem aber kann die Superklasse bereits diese Methoden aufrufen (und jede Unterklasse liefert hier eine eigene Implementierung).

Sollte eine Unterklasse eine dieser abstrakten Methoden brauchen, dann erhält diese Methode erst in der Unterklasse einen Body.

Das ist so nicht ganz richtig. Sobald eine Klasse mindestens eine abstrakte Methode umfasst, ist auch die Klasse als abstrakt zu markieren. Ein Exemplar einer abstrakten Klasse kannst Du aber nicht erzeugen, schließlich gibt es mindestens eine Mehtode (die vielleicht schon in der Klasse selbst aufgerufen wird), die überhaupt keine Implementierung besitzt.
Also ja, den "Body"/ die Implementierung wird in einer Ableitung eingefügt, aber das gilt für jede Ableitung von der Du ein Exemplar erzeugen willst (per new).
 

Zurück
Oben