Als ich anfing, mich mit objektorientierter Programmierung zu beschäftigen, machte ich den einfachen und wahrscheinlich weit verbreiteten Fehler, die Vererbung zu nutzen, um gemeinsames Verhalten zu teilen - auch wenn dieses Verhalten für die Natur des Objekts nicht wesentlich war.
Um ein in dieser Frage häufig verwendetes Beispiel weiter auszuführen, gibt es Lose von Dingen, die man streicheln kann - Freundinnen, Autos, kuschelige Decken... - Ich könnte also eine Petable-Klasse haben, die dieses allgemeine Verhalten bietet, und verschiedene Klassen, die davon erben.
Es liegt jedoch nicht in der Natur eines dieser Objekte, petable zu sein. Es gibt weitaus wichtigere Konzepte, die son Die Freundin ist eine Person, das Auto ist ein Landfahrzeug, die Katze ist ein Säugetier...
Verhaltensweisen sollten zunächst Schnittstellen zugeordnet werden (einschließlich der Standardschnittstelle der Klasse) und nur dann zu einer Basisklasse befördert werden, wenn sie (a) einer großen Gruppe von Klassen gemeinsam sind, die Untermengen einer größeren Klasse sind - in demselben Sinne, dass "Katze" und "Mensch" Untermengen von "Säugetier" sind.
Der Haken an der Sache ist, dass Sie, nachdem Sie das objektorientierte Design besser verstanden haben, als ich es anfangs tat, dies normalerweise automatisch tun, ohne darüber nachzudenken. So wird die nackte Wahrheit der Aussage "Code an eine Schnittstelle, nicht an eine abstrakte Klasse" so offensichtlich, dass man kaum glauben kann, dass sich jemand die Mühe macht, dies zu sagen - und man versucht, andere Bedeutungen hineinzulesen.
Eine weitere Sache, die ich hinzufügen würde, ist, dass, wenn eine Klasse rein abstrakt - ohne nicht-abstrakte, nicht-vererbte Mitglieder oder Methoden, die dem Kind, dem Elternteil oder dem Kunden zugänglich sind - warum ist sie dann eine Klasse? Sie könnte in einigen Fällen durch eine Schnittstelle und in anderen Fällen durch Null ersetzt werden.
11 Stimmen
Nur ein Punkt, den Sie meiner Meinung nach berücksichtigen sollten - Schnittstellen können verschiedene Einschränkungen mit sich bringen, derer Sie sich möglicherweise erst in sehr späten Phasen bewusst sind. Zum Beispiel mit .NET können Sie nicht serialisieren eine Schnittstelle Mitglied Variable, so dass, wenn Sie eine Klasse Zoo und ein Mitglied Variable Array von IAnimals haben Sie nicht in der Lage, Zoo serialisieren (und das bedeutet, schreiben WebServices oder andere Dinge, die eine Serialisierung wäre ein Schmerz).
2 Stimmen
Diese Frage könnte helfen, das Konzept der Schnittstellen zu verstehen. stackoverflow.com/q/8531292/1055241
0 Stimmen
Ich bin nur neugierig. Ich traf in der CLR über C# den folgenden Auszug:
I tend to prefer using the interface technique over the base type technique because the base type technique doesn’t allow the developer to choose the base type that works best in a particular situation.
. Ich kann nicht begreifen, was in dem Auszug gemeint ist. Wir können einige Basistypen erstellen und für jeden von ihnen einen abgeleiteten Typ erstellen, so dass ein Entwickler einen Basistyp auswählen kann. Könnte mir bitte jemand erklären, was ich übersehe? Ich glaube, es kann ein Teil dieser Frage sein. Oder sollte ich eine andere Frage zu dem spezifischen Auszug stellen?