Auswählen zwischen Klassen und Schnittstellen
Eine Schnittstelle definiert die Signaturen für einen Satz von Membern, den Implementierer bereitstellen müssen. Schnittstellen können keine Implementierungsdetails für die Member bereitstellen. Beispielsweise definiert die ICollection-Schnittstelle Member für das Arbeiten mit Auflistungen. Jede Klasse, die die Schnittstelle implementiert, muss die Implementierungsdetails für diese Member bereitstellen. Klassen können mehrere Schnittstellen implementieren.
Klassen definieren sowohl Membersignaturen als auch Implementierungsdetails für jeden Member. Das Verhalten von Abstract-Klassen (MustInherit in Visual Basic) kann dem Verhalten von Schnittstellen oder regulären Klassen insofern entsprechen, als sie Member definieren können, und sie können Implementierungsdetails bereitstellen, doch ist dies nicht erforderlich. Wenn eine abstrakte Klasse keine Implementierungsdetails bereitstellt, müssen konkrete Klassen, die von der abstrakten Klasse erben, die Implementierung bereitstellen.
Während sowohl abstrakte Klassen als auch Schnittstellen die Trennung des Vertrags von der Implementierung unterstützen, können Schnittstellen in neueren Versionen keine neuen Member angeben, während abstrakte Klassen ggf. Member hinzufügen können, um zusätzliche Funktionalität zu unterstützen.
Definieren Sie bevorzugt Klassen statt Schnittstellen.
In späteren Versionen einer Bibliothek können Sie Klassen problemlos neue Member hinzufügen. Schnittstellen können Sie keine Member hinzufügen, ohne die Konsistenz des Codes zu zerstören.
Verwenden Sie abstract-Klassen (MustInherit in Visual Basic) statt Schnittstellen, um den Vertrag von den Implementierungen zu trennen.
Definieren Sie eine Schnittstelle, wenn Sie eine polymorphe Hierarchie von Werttypen bereitstellen müssen.
Werttypen müssen von ValueType erben und können nur von ValueType erben. Daher können sie Vertrag und Implementierung nicht mithilfe von Klassen trennen. In diesem Fall müssen Sie eine Schnittstelle verwenden, wenn die Werttypen polymorphes Verhalten erfordern.
Definieren Sie Schnittstellen definieren, um einen ähnlichen Effekt wie Mehrfachvererbung zu erzielen.
Wenn ein Typ mehrere Verträge implementieren muss oder wenn der Vertrag für eine Vielzahl unterschiedlicher Typen gilt, verwenden Sie eine Schnittstelle. Beispielsweise wird IDisposable von Typen implementiert, die in vielen unterschiedlichen Szenarien verwendet werden. Wenn Sie festlegen, dass Klassen von einer Basisklasse erben müssen, um freigegeben werden zu können, wird die Klassenhierarchie zu unflexibel. Klassen, z. B. MemoryStream, die ihre streambasierten Verträge von ihren übergeordneten Klassen erben müssen, können diese Anforderung nicht erfüllen und gleichzeitig freigebbar sein.
Copyright für einzelne Teile 2005 Microsoft Corporation. Alle Rechte vorbehalten.
Copyright für einzelne Teile Addison-Wesley Corporation. Alle Rechte vorbehalten.
Weitere Informationen zu Entwurfsrichtlinien finden Sie unter „Framework-Entwurfs-Richtlinien: Idiome, Konventionen und Muster für wiederverwendbare .NET-Bibliotheken von Krzysztof Cwalina“ book und Brad Abrams, veröffentlicht von Addison-Wesley, 2005.
Siehe auch
Konzepte
Auswählen zwischen Klassen und Strukturen