Wann genau abstrakte Klasse und wann ein Interface verwenden?

ja,

1. wenn ein teil schon implementiert werden kann für die Subklassen dann abstrakte Klasse, sonst ein Interface

2. wenn ein Objekt einer Klasse mehreren Typen genügen muss, dann von einem Interface ableiten (Mehrfachvererbung - geht mit abstract- Klassen nicht)

3. wenn du in einer abstrakten Klasse alle Methoden "abstract" machst, dann entspricht das einem Interface

Hier eine Gegenüberstellung:

interface vs abstract class : Java Glossary
 
Zuletzt bearbeitet:
Generel ist das Interface der abstracten Klasse vorzuziehen, da du dadurch flexibler bleibst und hierarchische Abhaengigkeiten vermeidest (Mehrfachvererbung).

Wichtig ist das bei Vererbung die Klasse in denselben Aspect/Layer gehoert und nicht vermischt werden.
Model, Persistence, Security, Logging, GUI,... sollten untereinander nicht vermischt werden, vererbung innerhalb eines Aspects ist aber erlaubt.
 
Ich möchte es so formulieren:
Wenn es Klassen gibt, die thematisch absolut nichts miteinander gemeinsam haben, aber unbedingt eine oder mehrere Gemeinsamkeiten haben sollen, dann würde ich ein Interface bevorzugen.

Beispiel:
Apfel und Fahrrad | ein mögliches Interface -> VonDieserWelt


Wenn es sich um Klassen handelt die thematisch miteinander zu tun haben und sich in einer Vererbungshierarchie abbilden lassen, würde ich mit abstrakten Klassen arbeiten.

Beispiel: Typische Vererbung:
Fortbewegungsmittel - Fahrzeuge - Auto
 
Ein oft zu findendes Muster ist ein Interface an der Spitze der Hierarchie und eine abstrakte Klasse mit der "Grundfunktionalität", etwa java.util.List und java.util.AbstractList oder javax.swing.ListModel und javax.swing.AbstractListModel. Damit hat man immer die Freiheit, nur das Interface zu implementieren (wenn man z.B. von einer anderen Klasse erben will), kann aber in den meisten Fällen die vorgefertigte Funktionalität der abstrakten Klasse nutzen.
 

Zurück
Oben