Juan,
Ich betrachte Schnittstellen gerne als eine Möglichkeit, eine Klasse zu charakterisieren. Eine bestimmte Hunderassenklasse, z. B. ein YorkshireTerrier, kann von der übergeordneten Hundeklasse abstammen, aber sie implementiert auch IFurry, IStubby und IYippieDog. Die Klasse definiert also, was die Klasse ist, aber die Schnittstelle sagt uns etwas über sie.
Das hat den Vorteil, dass ich zum Beispiel alle IYippieDogs sammeln und in meine Ocean-Sammlung aufnehmen kann. Jetzt kann ich also eine bestimmte Menge von Objekten durchsuchen und diejenigen finden, die die gewünschten Kriterien erfüllen, ohne die Klasse zu genau untersuchen zu müssen.
Ich finde, dass Schnittstellen wirklich nur eine Teilmenge des öffentlichen Verhaltens einer Klasse definieren sollten. Wenn sie das gesamte öffentliche Verhalten für alle Klassen definiert, die sie implementieren, dann braucht sie normalerweise nicht zu existieren. Sie sagen mir nichts Nützliches.
Dieser Gedanke widerspricht jedoch der Idee, dass jede Klasse eine Schnittstelle haben sollte und man für die Schnittstelle programmieren sollte. Das ist in Ordnung, aber am Ende hat man eine Menge eins-zu-eins-Schnittstellen zu Klassen und das macht die Dinge verwirrend. Ich verstehe, dass der Gedanke dahinter ist, dass es nicht wirklich etwas kostet und dass man jetzt Dinge mit Leichtigkeit ein- und austauschen kann. Ich stelle jedoch fest, dass ich das nur selten tue. Meistens ändere ich nur die bestehende Klasse und habe genau die gleichen Probleme wie immer, wenn die öffentliche Schnittstelle der Klasse geändert werden muss, nur dass ich sie jetzt an zwei Stellen ändern muss.
Wenn Sie also wie ich denken, würden Sie definitiv sagen, dass Katze und Hund IPettable sind. Es ist eine Charakterisierung, die zu beiden passt.
Der andere Teil der Frage ist jedoch, ob sie dieselbe Basisklasse haben sollten. Die Frage ist, ob sie im Großen und Ganzen als dieselbe Sache behandelt werden müssen. Sicherlich sind sie beide Tiere, aber passt das zu der Art und Weise, wie wir sie zusammen verwenden werden?
Angenommen, ich möchte alle Tierklassen sammeln und sie in meinen Arche-Container legen.
Oder müssen es Säugetiere sein? Vielleicht brauchen wir eine Art tierübergreifende Melkfabrik?
Müssen sie überhaupt miteinander verbunden werden? Reicht es aus, wenn man weiß, dass sie beide IPettable sind?
Ich verspüre oft den Wunsch, eine ganze Klassenhierarchie abzuleiten, obwohl ich eigentlich nur eine Klasse brauche. Ich tue das in der Erwartung, dass ich es eines Tages brauchen könnte, und normalerweise ist das nicht der Fall. Und selbst wenn ich es brauche, muss ich in der Regel eine Menge tun, um das Problem zu lösen. Das liegt daran, dass die erste Klasse, die ich erstelle, nicht der Hund ist, so viel Glück habe ich nicht, es ist stattdessen das Schnabeltier. Jetzt basiert meine gesamte Klassenhierarchie auf dem bizarren Fall und ich habe eine Menge verschwendeten Code.
Vielleicht stellen Sie auch irgendwann fest, dass nicht alle Katzen IPett-fähig sind (wie die haarlose Katze). Jetzt können Sie diese Schnittstelle auf alle abgeleiteten Klassen übertragen, die passen. Sie werden feststellen, dass es eine viel weniger einschneidende Änderung ist, dass Cats plötzlich nicht mehr von PettableBase abgeleitet sind.
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?