Basisklassen-Entwurfsänderung nach der Bereitstellung
Aktualisiert: November 2007
Idealerweise ändern sich Klassenhierarchien nie nach der Bereitstellung, da selbst die kleinsten Änderungen ungeahnte Folgen haben können. In der Praxis sind solche Änderungen allerdings nicht immer vermeidbar: Produktanforderungen können sich ändern, und in Entwurfsspezifikationen fehlen manchmal wichtige Elemente. Eine Kategorie von Vererbungsproblemen wird als Problem mit instabilen Basisklassen bezeichnet.
Das Problem mit instabilen Basisklassen
Der Hauptnachteil von Vererbungshierarchien ist das Problem mit Instabilen Basisklassen. Änderungen an Basisklassen erfordern oft, dass die Basisklasse und jeder Code in den abgeleiteten Klassen geändert, neu kompiliert und neu verteilt wird. Dieses Problem ist noch größer, wenn mehrere Entwickler die Basisklasse und abgeleitete Klassen schreiben, da jeder Entwickler den Zugriff auf den eigenen Quellcode verweigern kann. Im schlimmsten Fall kann ein Kunde unbeabsichtigt das kompilierte binäre Format einer aktualisierten Basisklasse mit der ursprünglichen, inkompatiblen Binärversion der abgeleiteten Klassen verwenden.
Zu den Änderungen an Basisklassen, die potenziell abgeleitete Klassen unterbrechen können, gehören das Überschreiben oder Ändern des Datentyps von Basisklassenmembern.
Minimieren des Problems mit instabilen Basisklassen
Am besten vermeiden Sie Probleme mit instabilen Basisklassen, indem Sie Änderungen nur an abgeleiteten Klassen vornehmen. Dies ist jedoch nicht immer möglich, da Sie schon bei der ersten Freigabe der Basisklasse alle eventuellen Entwicklungsmöglichkeiten berücksichtigen müssten. Trotz größter Bemühungen lassen sich unvorhergesehene Änderungen an der Basisklasse nicht immer vermeiden.
Verwenden Sie MustInherit-Klassen und MustOverride-Methoden, um die Probleme mit instabilen Basisklassen zu reduzieren. Durch die Verwendung dieser Klassen und Methoden werden die Implementierungsdetails in abgeleitete Klassen verschoben und somit die Notwendigkeit für Änderungen an der Basisklasse verringert. Dies ist jedoch wiederum nicht immer möglich, selbst nicht bei der besten Planung.
Datenmember, über die ein Shadowing ausgeführt wurde, sind in abgeleiteten Klassen ebenfalls hilfreich, da sie Namenskonflikte mit Basisklassenmembern reduzieren.
Der sicherste Weg, die Funktionalität einer Basisklasse zu erweitern, besteht darin, neue Member hinzuzufügen. Neue Member können eine Basisklasse nur dann unterbrechen, wenn die abgeleitete Klasse das Overloads-Schlüsselwort verwendet, um Methoden von der Basisklasse zu erben, und neue Methoden mit demselben Namen einführt. Dieses Problem kann vermieden werden, indem Sie in der abgeleiteten Klasse ausdrücklich angeben, welche Basisklassenmethoden von der Basis geerbt werden sollen, indem Sie diese Methoden neu definieren und an sie delegieren.
Alle Basisklassen sind also bis zu einem gewissen Grad instabil. Letztendlich kann das Problem mit instabilen Basisklassen nicht eliminiert werden. Es lässt sich jedoch durch den sorgfältigen Entwurf von Klassenhierarchien minimieren, durch den die Notwendigkeit von Basisklassenänderungen reduziert wird, sowie durch gründliches Testen, wenn solche Änderungen unvermeidbar sind.