Eine Pauschalantwort gibt es nicht. Aber wenn man sich aus (guten Gründen) für eine Vererbung entschieden hat, dann sollte einem klar sein, dass man die Klassen nicht auch noch von anderen Quellen erben lassen kann. Wenn man also nicht wirklich Basisfunktionalität braucht, sondern nur die Schnittstelle, dann sollte man Interface verwenden.
Ggf. lässt sich auch beides verwenden, um gegen das Interface zu programmieren, aber dennoch Basisfunktionalität in einer Klassenhierarchie zu haben, die sowohl von der Basisklasse erbt als auch das Interface implementiert.
Naja, Vererbung is denke ich sinnvoll, wenn man ein Oberbegriff hat z.b. Person und dann Unterpersonen wie Arbeitnehmer, Arbeitgeber.
Interface sind denke ich sinnvoll, wenn man zum Beispiel zwischen Schichten eine "Kommunikation" herstellen will und somit gewährleistet, dass bestimmte Methoden auf jeden Fall vorhanden und implementiert sind.
So, bei der Vererbung gibt das Auto das Verhalten "fahren" vor.
Wenn also ein Subobject ein Verhalten vom SuperObject haben soll, dann nimmt man die Vererbung.
So das Interface Person gibt vor was die Klasse(Object vo Typ Person) implementieren müssen, aber nicht wie sie es machen. Also muss jede Klasse für das Verhalten selber sorgen.
Vielleicht wird es dadurch klarer.
der Aspekt der Kommunikation verschiedener Klassen trifft es eigentlich recht gut.
Unterperson klingt so diskriminierend^^.
Ich habe aktuell ein Projekt, bei dem ich die Personen als Interface nutze.
In meinem Fall geht es um die reinen PersonenDaten, welche gleichrangig für Einlieferer und Kunden behandelt werden.
Es würde sich auch anbieten, das Interface zu nutzen, wenn es Arbeitgeber und Arbeitnehmer wären, solange es nur um die PersonenDaten ginge.
Wenn mans verallgemeinern möchte, dann "Vererbung/Delegation bei Hierachie" und "Interface bei gleichrangiger Behandlung".
Gibts natürlich noch viel mehr Anwendungsmöglichkeiten ist aber vielleicht schon mal ne Entscheidungshilfe für dich.
Ich programmiere sehr gerne gegen Interfaces. Die eigentl. Anwendung bezieht sich dann fast ausschließlich darauf und ich kann einfach Implementierungen austauschen (vor allem, da ich Guice einsetze).
Von Klassen erben zu lassen, macht eben dann Sinn, wenn man bestehenden Implementierungen weiter verwenden will (Redundants vermeiden).
Wo ich keine Interfaces einsetze sind bei (ich nenns mal) Property Holder. Also z.B.:
aber pauschalisieren würde ich da jetzt nichts. Das kann sich von Anwendungsfall zu Anwendungsfall zu Programmierers vorlieben immer wieder unterscheiden.
Das ist meiner Meinung nach einer der größten Fehler, die man beim Einsatz von Vererbung machen kann. Vererbung dient nicht zur Code-Wiederverwertung (das kann man über Delegation lösen). Sie muss sich immer an den Prinzipien des objektorientierten Designs halten (is-a-Beziehung).
Naja, hab das ein wenig anderster gemeint. Angenommen man hat eine Klasse Säugetier mit der Methode atmen. Darin wird beschrieben, dass die Lunge dazu verwendet wird. Das (Säugetier) jetzt als Interface zu behandeln wäre imho nicht sinnvoll, da alle Säugetiere afaik das auf die gleiche Art und Weiße machen -> Ergo das kommt in die Klasse Säugetier und gilt so erstmal für alle, die auch eines sind (z.b. Hund).
Von der "is-a-Beziehung" bin ich einfach mal ausgegangen, dass es logisch auch so ist.
Dieses Audi VW Beispiel ist ein typisches Beispiel wie man es meiner Meinung nach nicht machen soll....
Das sind unterschiedliche Ausprägungen der Eigenschaften, wenn sie unterschiedliches Verhalten haben, dann würd ich dieses Verhalten kapseln und über Komposition austauschbar machen....