Heute hat mir jemand gesagt, dass die Implementierung der Schnittstelle in C # nur eine "Can-Do" -Beziehung ist, nicht eine "Is-A" -Beziehung. Dies steht im Widerspruch zu meinem langjährigen Glauben an LSP (Liskow Substitution Principle). Ich denke immer, dass alle Vererbung "Is-A" Beziehung bedeutet.
Also, wenn die Schnittstellenimplementierung nur eine "Can-Do" -Beziehung ist. Was ist, wenn es eine Schnittstelle "IHuman" und "IEngineer" gibt und eine Klasse "Programmer" von "IHuman" & amp; "IEngineer"? Sicherlich ist ein "Programmierer" ein "IHuman" und ein "IEngineer".
Wenn es nur eine "Can-Do" -Beziehung ist, bedeutet das, dass wir nicht erwarten können, dass das Verhalten des "Programmer" -Instanzs anders sein wird, wenn es als IHuman behandelt und als IEngineer behandelt wird?
Nach meiner Erfahrung hilft es nicht wirklich, an "Ist-Ein" - und "Kann-Machen" -Beziehungen zu denken. Sie geraten schnell in Probleme. Es ist im Grunde eine Impedanzabweichung zwischen der realen Welt und OO. So viele Leute tatsächlich über die Modellierung der realen Welt sprechen, müssen Sie grundsätzlich verstehen, was die Beziehungen zwischen den Typen auf der Plattform bedeuten, die Sie verwenden.
Manchmal können Schnittstellen als Fähigkeiten verwendet werden, und manchmal können sie eher eine normale "ist-a" -Beziehung darstellen. Ich würde mich nicht allzu sehr darüber aufregen - vergewissere dich, dass du verstehst, was sie tun können und was nicht.
Ich neige dazu, Interfaces als einen Vertrag des Verhaltens zu betrachten. Schnittstellen wie IComparable und IEnumerable sind klassische Beispiele.
In dem Beispiel, das Sie angegeben haben, sind IHuman und IEngineer nicht wirklich Verhaltensweisen.
Ich fand diese Frage ziemlich spät, aber ich wollte hineinspielen.
Schnittstellen in C # haben eine Is-a-Beziehung, sind aber nicht ein Objekt. Es ist vielmehr eine Implementierung.
Mit anderen Worten, für Klasse Foo, die IBar implementiert, der folgende Test:
%Vor%kehrt wahrlich zurück. Sie können auch sagen,
%Vor%Oder, wenn eine Methode eine IBar erfordert, können Sie ein Foo übergeben.
%Vor%Offensichtlich hat ein IBar selbst keine Implementierung, daher gilt auch die Can-Do-Beziehung.
%Vor%Aber das gilt auch für die Objektvererbung; Ein Objekt der Klasse Foo, das die Klasse Bar erbt, hat eine Can-Do-Beziehung sowie eine Is-A-Beziehung, genau wie die Schnittstelle. Es ist nur, dass seine Implementierung für sie vorgebaut wurde.
Die eigentliche Frage ist, was ist , kann was ? Ein geerbtes Klassenobjekt ist-a- [übergeordnete Instanz] und can-do- [Verhalten der übergeordneten Klasse] , während eine Implementierung einer Schnittstelle is-an- [ Schnittstellenimplementierung] und kann daher [das Verhalten der Schnittstelle] .
In den meisten Fällen, in denen programmatic eine Beziehung wie die oben aufgeführten verwendet, wird nur die Schnittstelle ausgewertet, sodass sowohl eine vererbte Klasse als auch eine implementierte Schnittstelle dieselben Eigenschaften von is-a und can-do haben.
HTH, Jon
Die Designer des .NET-Frameworks verwenden Schnittstellen, um eine "hat eine" (oder "kann") -Beziehung zu bestimmen, während "ist ein" durch Vererbung implementiert wird.
Die Gründe dafür finden Sie im Abschnitt Auswahl zwischen Klassen und Interfaces im .NET Framework-Entwicklerhandbuch:
Eine Schnittstelle definiert die Signaturen für eine Gruppe von Mitgliedern, die Implementierer bereitstellen müssen. Schnittstellen können keine Implementierungsdetails für die Mitglieder bereitstellen.
Da die Beispielklassen "Programmer" und "Engineer" sehr wahrscheinlich mit ihren eigenen spezifischen Funktionen ausgestattet sind, werden sie geeignetererweise durch Vererbung implementiert.
Das ist der Grund, warum die meisten Schnittstellen Fähigkeiten und keine Namen sind, also haben Sie
IComparable, ITestable, IEnumerable
und
Mensch, Tier, Hund usw.
Wie schon erwähnt, müssen Sie pragmatisch sein, ich habe eine allgemeine Regel, wenn ich kodiere: lassen Sie niemals Konzepte, Konventionen oder Standardpraktiken auf den Weg kommen, um den Job zu erledigen , sei besser pragmatisch als akademisch.
Wenn Sie also sicher sind, dass die Schnittstellen wirklich besser zu Ihrem Design passen, dann machen Sie sich keine Sorgen um diese Frage.
Tags und Links c# inheritance interface lsp