Basisklassen zum Implementieren von Abstraktionen
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.
Streng genommen wird eine Klasse zu einer Basisklasse, wenn eine andere Klasse davon abgeleitet wird. Für den Zweck dieses Abschnitts ist eine Basisklasse jedoch eine Klasse, die hauptsächlich zum Bereitstellen einer allgemeinen Abstraktion entworfen wurde, oder für andere Klassen, um eine Standardimplementierung über Vererbung wiederzuverwenden. Basisklassen befinden sich in der Regel in der Mitte der Vererbungshierarchien zwischen einer Abstraktion am Stamm einer Hierarchie und mehreren benutzerdefinierten Implementierungen im unteren Bereich.
Sie dienen als Implementierungshilfen zum Implementieren von Abstraktionen. Beispielsweise ist eine der Abstraktionen des Frameworks für geordnete Sammlungen von Elementen die IList<T>-Schnittstelle. Das Implementieren von IList<T> ist nicht trivial, weshalb das Framework mehrere Basisklassen bereitstellt, z. B. Collection<T> und KeyedCollection<TKey,TItem>, die als Hilfen zum Implementieren benutzerdefinierter Auflistungen dienen.
Basisklassen eignen sich in der Regel nicht selbst als Abstraktionen, da sie tendenziell zu viel Implementierung enthalten. Zum Beispiel enthält die Basisklasse Collection<T>
eine umfangreiche Implementierung, die mit der Tatsache zusammenhängt, dass sie die nicht generische Schnittstelle IList
implementiert (um sich besser in nicht generische Sammlungen zu integrieren), und mit der Tatsache, dass es sich um eine Sammlung von Elementen handelt, die in einem ihrer Felder im Arbeitsspeicher gespeichert sind.
Wie bereits erwähnt, können Basisklassen eine wertvolle Hilfe für Anwender sein, die Abstraktionen implementieren müssen, aber gleichzeitig können sie auch eine erhebliche Belastung darstellen. Sie vergrößern die Oberfläche und erhöhen die Tiefe der Vererbungshierarchien und verkomplizieren so konzeptionell das Framework. Daher sollten Basisklassen nur dann verwendet werden, wenn Sie für die Benutzer des Frameworks einen beträchtlichen Mehrwert bereitstellen. Sie sollten vermieden werden, wenn sie nur für die Implementierer des Frameworks einen Mehrwert bereitstellen. In diesem Fall sollte die Delegierung an eine interne Implementierung anstelle der Vererbung von einer Basisklasse unbedingt berücksichtigt werden.
✔️ ERWÄGEN Sie, Basisklassen als abstrakt zu kennzeichnen, auch wenn Sie keine abstrakten Member enthalten. Damit wird Benutzern klar kommuniziert, dass die Klasse nur für Vererbung vorgesehen ist.
✔️ ERWÄGEN Sie, Basisklassen in einem separaten Namespace getrennt von den Hauptszenariotypen zu platzieren. Basisklassen sind per Definition für fortgeschrittene Erweiterungsszenarien gedacht und daher für die Mehrheit der Benutzer nicht interessant.
❌ VERMEIDEN Sie das Benennen von Basisklassen mit dem Suffix „Base“, wenn die Klasse für die Verwendung in öffentlichen APIs vorgesehen ist.
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.