Nehmen wir Ihr Beispiel einer Hunde- und einer Katzenklasse und veranschaulichen wir es mit C#:
Sowohl ein Hund als auch eine Katze sind Tiere, genauer gesagt, vierbeinige Säugetiere (Tiere sind viel zu allgemein). Nehmen wir an, dass Sie eine abstrakte Klasse Mammal für beide haben:
public abstract class Mammal
Diese Basisklasse wird wahrscheinlich Standardmethoden haben, wie z.B.:
Es handelt sich dabei um Verhaltensweisen, die bei beiden Arten mehr oder weniger gleich umgesetzt werden. Um dies zu definieren, müssen Sie:
public class Dog : Mammal
public class Cat : Mammal
Nehmen wir nun an, dass es andere Säugetiere gibt, die wir normalerweise in einem Zoo sehen:
public class Giraffe : Mammal
public class Rhinoceros : Mammal
public class Hippopotamus : Mammal
Dies gilt auch weiterhin, da der Kern der Funktionalität Feed()
y Mate()
wird immer noch derselbe sein.
Giraffen, Nashörner und Nilpferde sind jedoch nicht gerade Tiere, die man als Haustiere halten kann. Hier wird eine Schnittstelle nützlich sein:
public interface IPettable
{
IList<Trick> Tricks{get; set;}
void Bathe();
void Train(Trick t);
}
Die Implementierung des oben genannten Vertrages wird bei einer Katze und einem Hund nicht gleich sein; ihre Implementierungen in eine abstrakte Klasse zu vererben, wäre eine schlechte Idee.
Ihre Definitionen für Hund und Katze sollten nun wie folgt aussehen:
public class Dog : Mammal, IPettable
public class Cat : Mammal, IPettable
Theoretisch kann man sie von einer höheren Basisklasse aus überschreiben, aber im Wesentlichen erlaubt eine Schnittstelle, nur die Dinge hinzuzufügen, die man in einer Klasse braucht, ohne die Notwendigkeit der Vererbung.
Da man in der Regel nur von einer abstrakten Klasse erben kann (in den meisten statisch typisierten OO-Sprachen, d.h. mit Ausnahme von C++), aber in der Lage ist, mehrere Schnittstellen zu implementieren, ist es möglich, Objekte in einem strikten Rahmen zu konstruieren. nach Bedarf Basis.
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?