Daniel Thoma: Abstrakte Klassen - wozu?

Beitrag lesen

Hallo Eddie,

Interfaces ermöglichen es, eine Schnittstelle zu definieren, die von beliebigen Klassen implementiert werden kann. Der Vorteil ist nicht, dass die Implementierung der Klassen irgendwie einfacher würde, sondern dass man Algorithmen schreiben kann, die nur eine bestimmte Schnittstelle benötigen ohne dass man sich festlegen muss, um welche Klasse es sich handelt.

Ein einfaches Beispiel ist das Iterface "Comparable" das eine Methode hat, um zwei Objekte zu vergleichen. Dadurch kann man Algorithmen und Datenstrukturen (Sortierte Listen u.ä.) schreiben, die für alle Klassen funktionieren, die eine Schnittstelle zum Vergleichen vorsehen.

Die abstrakte Klasse hat vom Zweck her eigentlich wenig mit dem Interface gemein. Sie bietet die Möglichkeit, aus mehreren konkreten Klassen gemeinsame Teile herauszuziehen, ohne das dabei etwas entstehen muss, was wirklich instantierbar wäre. Abstrakte Klassen werden oft verwendet um ein Grundgerüst für die Implementierung zu bieten.
Beispiel davon ist die Klasse AbstractList, die für fast alle Methoden des List-Interfaces implementierungen angibt, außer für ein paar sehr grundlegende zum direkten lesen und schreiben der Liste.

(Die erwähnten Beispiele gehören zur Java-API, aber auch ohne diese zu kennen sollten sie verständlich sein)

Ein (möglicherweise) schlechtes Beispiel für eine (abstrakte) Klasse ist das Beispiel von Rouven mit der abstrakten Klasse Person und den davon abgeleiteten Klassen Kunde und Mitarbeiter.
Bei solchen Entwürfen muss man aufpassen, dass man nicht in die Verlegenheit  kommt, Personen zu haben, die Kunden und Mitarbeiter sind oder ihren Status sogar ändern. Es kann in solchen Fällen sinnvoller sein, Personen eine Liste von Rollen zuzuordnen. Rolle könnte man dann aber wieder als abstrakte Klasse umsetzen (oder auch als Interface, wenn man die Implementierung da erst mal raushalten will).

Grüße

Daniel