Freigeben über


Schnittstellenentwurf

Hinweis

Diese Inhalte wurden mit Genehmigung von Pearson Education, Inc. aus Framework Design Guidelines nachgedruckt: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Diese Ausgabe wurde 2008 veröffentlicht, und das Buch wurde seitdem in der dritten Ausgabe vollständig überarbeitet. Einige der Informationen auf dieser Seite sind möglicherweise veraltet.

Obwohl die meisten APIs am besten mithilfe von Klassen und Strukturen modelliert werden, gibt es Fälle, in denen Schnittstellen besser geeignet oder die einzige Option sind.

Die CLR unterstützt keine mehrfache Vererbung (d. h., CLR-Klassen können nicht von mehreren Basisklassen erben), aber ermöglicht Typen, zusätzlich zum Erben von einer Basisklasse eine oder mehrere Schnittstellen zu implementieren. Daher werden Schnittstellen häufig verwendet, um den Effekt der Mehrfachvererbung zu erzielen. IDisposable ist beispielsweise eine Schnittstelle, die Typen ermöglicht, Verfügbarkeit unabhängig von jeder anderen Vererbungshierarchie zu unterstützen, an der sie teilnehmen möchten.

Eine andere Situation, in der das Definieren einer Schnittstelle angemessen ist, ist das Erstellen einer gemeinsamen Schnittstelle, die von verschiedenen Typen einschließlich einiger Werttypen unterstützt werden kann. Werttypen können nicht von anderen Typen als ValueType erben, jedoch Schnittstellen implementieren, sodass die Verwendung einer Schnittstelle die einzige Option ist, einen gemeinsamen Basistyp bereitzustellen.

✔️ DEFINIEREN Sie eine Schnittstelle, wenn Sie eine gemeinsame API benötigen, die von einem Satz von Typen unterstützt wird, der Werttypen einschließt.

✔️ ERWÄGEN Sie, eine Schnittstelle zu definieren, wenn Sie ihre Funktionalität für Typen unterstützen müssen, die bereits von einem anderen Typ erben.

❌ VERMEIDEN Sie die Verwendung von Markerschnittstellen (Schnittstellen ohne Member).

Wenn Sie eine Klasse markieren müssen, weil Sie ein bestimmtes Merkmal (Marker) aufweist, verwenden Sie im Allgemeinen ein benutzerdefiniertes Attribut anstelle einer Schnittstelle.

✔️ STELLEN SIE mindestens einen Typ BEREIT, bei dem es sich um eine Implementierung einer Schnittstelle handelt.

Dies erleichtert das Überprüfen des Entwurfs der Schnittstelle. List<T> ist beispielsweise eine Implementierung der IList<T>-Schnittstelle.

✔️ GEBEN SIE mindestens eine API AN, die jede von Ihnen definierte Schnittstelle nutzt (eine Methode, die die Schnittstelle oder eine Eigenschaft, der der Typ Schnittstelle zugewiesen ist, als Parameter annimmt).

Dies erleichtert das Überprüfen des Schnittstellenentwurfs. Beispielsweise verwendet List<T>.Sort die System.Collections.Generic.IComparer<T>-Schnittstelle.

❌ Fügen Sie KEINE Member einer Schnittstelle hinzu, die zuvor bereitgestellt wurde.

Dies würde die Implementierungen der Schnittstelle zerstören. Sie sollten eine neue Schnittstelle erstellen, um Versionsprobleme zu vermeiden.

Mit Ausnahme der in dieser Anleitung beschriebenen Situationen sollten Sie im Allgemeinen Klassen anstelle von Schnittstellen verwenden, um wiederverwendbare Bibliotheken für verwalteten Code zu entwerfen.

Teile ©2005, 2009 Microsoft Corporation. Alle Rechte vorbehalten.

Nachdruck mit Genehmigung von Pearson Education, Inc aus Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition von Krzysztof Cwalina und Brad Abrams, veröffentlicht am 22. Oktober 2008 durch Addison-Wesley Professional als Teil der Microsoft Windows Development Series.

Weitere Informationen