Danke für Antwort an por Jon Limjap aber ich möchte einige Erläuterungen zum Konzept der Schnittstelle und der abstrakten Basisklassen hinzufügen
Schnittstellentypen vs. abstrakte Basisklassen
Angepasst an die Pro C# 5.0 und das .NET 4.5 Framework Buch.
Der Schnittstellentyp mag einer abstrakten Basisklasse sehr ähnlich sein. Erinnern Sie sich an dass eine Klasse, die als abstrakt gekennzeichnet ist, eine beliebige Anzahl von abstrakten Mitgliedern definieren kann, um eine polymorphe Schnittstelle für alle abgeleiteten Typen bereitzustellen. Aber auch wenn eine Klasse eine Reihe von abstrakten Mitglieder definiert, steht es ihr auch frei, eine beliebige Anzahl von Konstruktoren, Felddaten, nicht-abstrakten Mitgliedern (mit Implementierung), und so weiter. Schnittstellen hingegen enthalten nur abstrakte Mitgliederdefinitionen. Die polymorphe Schnittstelle, die von einer abstrakten Elternklasse eingerichtet wird, leidet unter einer wesentlichen Einschränkung dass nur abgeleitete Typen die von der abstrakten Elternklasse definierten Elemente unterstützen. Allerdings ist es in größeren Softwaresystemen ist es jedoch sehr üblich, mehrere Klassenhierarchien zu entwickeln, die keinen gemeinsamen Elternteil haben über System.Object hinaus haben. Da abstrakte Elemente in einer abstrakten Basisklasse nur für abgeleitete Typen gelten, haben wir keine Möglichkeit, Typen in verschiedenen Hierarchien so zu konfigurieren, dass sie die gleiche polymorphe Schnittstelle zu unterstützen. Nehmen wir als Beispiel an, Sie haben die folgende abstrakte Klasse definiert:
public abstract class CloneableType
{
// Only derived types can support this
// "polymorphic interface." Classes in other
// hierarchies have no access to this abstract
// member.
public abstract object Clone();
}
Angesichts dieser Definition können nur Member, die CloneableType erweitern, die Methode Clone() Methode unterstützen. Wenn Sie eine neue Reihe von Klassen erstellen, die diese Basisklasse nicht erweitern, können Sie diese polymorphe Schnittstelle nicht nutzen. Vielleicht erinnern Sie sich auch daran, dass C# keine Mehrfachvererbung für Klassen unterstützt. Wenn Sie also einen MiniVan erstellen wollten, der ein Auto und ein CloneableType ist, ist dies nicht möglich:
// Nope! Multiple inheritance is not possible in C#
// for classes.
public class MiniVan : Car, CloneableType
{
}
Wie Sie sich denken können, kommen die Schnittstellentypen zur Hilfe. Nachdem eine Schnittstelle definiert worden ist, kann sie von jeder Klasse oder Struktur in jeder Hierarchie, in jedem Namespace oder in jeder Assembly implementiert werden (geschrieben in einer beliebigen .NET-Programmiersprache). Wie Sie sehen können, sind Schnittstellen in hohem Maße polymorph. Betrachten Sie die .NET-Standardschnittstelle ICloneable, die im Namespace System definiert ist. Diese Schnittstelle definiert eine einzige Methode namens Clone():
public interface ICloneable
{
object Clone();
}
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?