4.5 Weitere Gesichtspunkte der Vererbung
4.5.1 Versiegelte Methoden

Standardmäßig können alle Klassen abgeleitet werden. Ist dieses Verhalten für eine bestimmte Klasse nicht gewünscht, kann sie mit sealed versiegelt werden. Sie ist dann nicht ableitbar.
In ähnlicher Weise können Sie auch dem weiteren Überschreiben einer Methode einen Riegel vorschieben, indem die Definition der Methode um den Modifizierer sealed ergänzt wird:
class Flugzeug : Luftfahrzeug {
public sealed override void Starten() {
Console.WriteLine("Das Flugzeug startet");
}
}
Listing 4.24 Definition einer versiegelten Methode
Eine von Flugzeug abgeleitete Klasse erbt zwar die versiegelte Methode Starten, kann sie aber selbst nicht mit override überschreiben. Es ist jedoch möglich, in einer weiter abgeleiteten Klasse eine geerbte, versiegelte Methode mit new zu überdecken, um eine typspezifische Anpassung vornehmen zu können.
Der Modifizierer sealed kann nur zusammen mit override in einer Methodensignatur einer abgeleiteten Klasse verwendet werden, wenn die Methode in der Basisklasse als virtuelle Methode bereitgestellt wird. Die Kombination sealed new ist unzulässig (weil sinnlos), ebenso das alleinige Verwenden von sealed in der Methodensignatur.
4.5.2 Überladen einer Basisklassenmethode

Oft ist es notwendig, die von einer Basisklasse geerbten Methoden in der Subklasse zu überladen, um ein Objekt vom Typ der Subklasse an speziellere Anforderungen anzupassen. Von einer Methodenüberladung wird bekanntlich gesprochen, wenn sich zwei gleichnamige Methoden einer Klasse nur in ihrer Parameterliste unterscheiden. Derselbe Begriff hat sich geprägt, wenn eine geerbte Methode in der Subklasse nach den Regeln der Methodenüberladung ergänzt werden muss.
Betrachten wir dazu noch einmal die Starten-Methode in Luftfahrzeug. Die Klasse Flugzeug leitet Luftfahrzeug und überlädt die geerbte Methode:
public class Flugzeug : Luftfahrzeug {
public void Starten(double distance) {
[...]
}
}
Wird ein Objekt vom Typ Flugzeug erzeugt, kann auf die Referenz mit beiden Methoden operiert werden, z. B.:
flg.Starten();
flg.Starten(300);
4.5.3 Statische Member und Vererbung

Statische Member werden an die abgeleiteten Klassen vererbt. Eine statische Methode kann man auf die Klasse anwenden, in der die Methode definiert ist, oder auf die Angabe der abgeleiteten Klasse. Bezogen auf das Projekt GeometricObjects können Sie demnach die statische Methode Bigger entweder mit
Circle.Bigger(kreis1, kreis2);
oder mit
GraphicCircle.Bigger(kreis1, kreis2);
aufrufen. Dabei sind kreis1 und kreis2 Objekte vom Typ Circle.
Unzulässig ist die Definition einer statischen Methode mit virtual, override oder abstract. Wollen Sie dennoch eine geerbte statische Methode in der ableitenden Klasse neu implementieren, können Sie die geerbte Methode mit einer Neuimplementierung verdecken, die den Modifizierer new aufweist.
4.5.4 Geerbte Methoden ausblenden?
Zugriffsmodifizierer beschreiben die Sichtbarkeit. Ein public deklariertes Mitglied ist über die Grenzen der aktuellen Anwendung hinaus bekannt, während der Modifizierer internal die Sichtbarkeit auf die aktuelle Assemblierung beschränkt. private Klassenmitglieder hingegen sind nur in der definierenden Klasse sichtbar.
Ein verdeckender Member muss nicht zwangsläufig denselben Zugriffsmodifizierer haben wie das überdeckte Mitglied in der Basisklasse. Machen wir uns das kurz an der Klasse Flugzeug klar und verdecken wir die geerbte öffentliche Methode Starten der Klasse Luftfahrzeug durch eine private-Implementierung in Flugzeug.
public class Flugzeug : Luftfahrzeug {
private new void Starten() {
Console.WriteLine("Das Flugzeug startet.");
}
}
Die verdeckende Methode Starten ist nun nur innerhalb von Flugzeug sichtbar. Einen interessanten Effekt stellen wir fest, wenn wir jetzt den folgenden Code schreiben:
static void Main(string[] args) {
Flugzeug flg = new Flugzeug();
flg.Starten();
}
Im Konsolenfenster wird »Das Luftfahrzeug startet.« ausgegeben.
Aus allem, was bisher gesagt worden ist, müssen wir die Schlussfolgerung ziehen, dass das vollständige Ausblenden eines geerbten Mitglieds nicht möglich ist, auch nicht durch »Privatisierung«. Das führt uns zu folgender Erkenntnis:
Grundsätzlich werden alle Member der Basisklasse geerbt. Davon gibt es keine Ausnahme. Auch das Ausblenden durch Privatisierung in der erbenden Klasse ist nicht möglich.
Wollen Sie unter keinen Umständen eine Methode aus der Basisklasse erben, bleibt Ihnen nur ein Weg: Sie müssen das Konzept Ihrer Klassenhierarchie neu überdenken.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.