Abstrakte Klassen /Interface

zitamina

Neues Mitglied
Im vergleiche zu Interfaces haben abstrakter Klassen als Vorteil das Hinzufügen von Methoden mit Default-Implementierung bei der Erweiterung der Schnittstelle. Dies kann aber auch ein Nachteil sein. Warum ist das so?
 
Das ist eine große Einschränkung. Eine Klasse kann zwar mehrere Interfaces implementieren, aber nur von einer abstrakten Klasse abgeleitet sein.
 
Die Defaultimplementierungen können nur durch überschreiben geändert werden. Man wird aber darauf nicht hingewiesen im Sinne von "must implement abstrakt Methods".
 
Teilaspekte wurden hier schon gepostet.
Jedoch erklärt sich der eigentliche Unterschied zwischen abstrakten Klassen und interfaces aus der polymorphen Sicht der Objektorientierung. Das ist zwar jetzt sehr theoretisch, aber zum Gesamtverständnis der Objektorientierung ein wesentlicher Unterschied.

1) Eine Klasse beschreibt ein konkretes Objekt der realen Welt.
2) Eine abstrakte Klasse beschreibt ein Objekt der realen Welt, welches jedoch nicht konkret ist und damit als eigenständiges Objekt nicht existieren darf/soll, sondern nur Spezialisierungen davon.
3) Ein Interface beschreibt bestimmte "Fähigkeiten" von (i.d.R. mehreren) Objekten. Insofern werden Interfaces von Java-Entwicklern auch immer "....able" benannt, wie z.B. Clonable, Obserable, Serializable, Comparable, ....

Da eine abstrakte Klasse ein Objekt beschreibt und keine Fähigkeiten eines oder mehrerer Objekte, kann es auch Teilimplementierungen enthalten. Abstrakte Klassen dürfen nämlich sehr wohl Implementierungen enthalten, Interfaces nicht. Aus dem selben Grund dürfen abstrakte Klassen auch über "Eigenschaften" in Form von nicht abstrakten Variablen verfügen.

Da abstrakte Klassen nicht eigenständige Objekte repräsentieren, kann eine abstrakte Klasse nicht instanziert werden, sondern nur die Spezialisierungen davon. Die Methoden einer abstrakten Klasse "können" (=müssen nicht) durch die Spezialisierung "überschrieben" werden.
Methoden eines interfaces "müssen" durch die Klasse "implementiert" werden.

Gruß
JP
 
Unter Umständen entspricht die Default-Implementierung dabei nicht dem Verhalten, welches für eine (inzwischen bereits) abgeleitete Klasse eigentlich erforderlich wäre.
 

Zurück
Oben