Rubrik: Verschiedenes / Sonstiges | VB-Versionen: VB2005, VB2008 | 30.05.08 |
Möglichkeiten der Polymorphie bei abgeleiteten Klassen einschränken Die Überschreibung von öffentlichen Methoden (Public MustOverride/ Overridable Sub bzw. Function) bietet die Möglichkeit der Polymorphie. Wie lasen sich diese Möglichkeiten soweit einschränken, dass ein bestimmtes Grundverhalten erzwungen wird? | ||
Autor: Hans-Joachim Meßner | Bewertung: | Views: 11.336 |
ohne Homepage | System: Win2k, WinXP, Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Im Rahmen der objektorientierten Programmierung besteht die Möglichkeit, eine Methode in einer abgeleiteten Klasse zu überschreiben, d.h. neu zu implementieren und somit Polymorphie zu erzielen.
Zum Beispiel:
Basisklasse:
Public MustInherit Class Tier Public MustOverride Sub Schreien() ... End Class
Eine Implementation könnte sein:
Public Class Katze Inherits Tier Public Overrides Sub Schreien() ' Miauen ... End Sub ... End Class
Eine weitere Implementation:
Public Class Hund Inherits Tier Public Overrides Sub Schreien() ' Bellen ... End Sub ... End Class
Das Problem bei diesem Code liegt darin, dass in den überschriebenen Methoden so gut wie jede Implementation möglich ist. Wenn aber z. B. die Basisklasse eine bestimmte Implementation erwartet, nämlich eine bestimmte Codesequenz, etwa den Aufruf der "Sub Wecke_Herrchen (Herrchen As Object)", dann stellt sich die Frage, wie das realisiert werden kann.
Möglich wäre zunächst, in der Basisklasse "Tier" die Methode so zu definieren...
Public Overridable Sub Schreien() Wecke_Herrchen(Herrchen) End Sub
...und für abgeleitete Klassen in der Dokumentation vorzuschreiben, dass jede überschriebene Version der Methode "Schreien" den Aufruf "MyBase.Schreien" enthalten muss. Das kann aber nicht erzwungen werden.
Die hier vorgestellte Lösung beruht darauf, dass nicht nur als "Public" deklarierte Methoden als überschreibbar deklariert werden können, sondern auch solche, die als "Protected" deklariert sind, und auch die Methoden der Basisklasse die überschriebenen Versionen dieser Methoden aufrufen.
In der Basisklasse "Tier" kann die Methode Schreien somit als nicht überschreibbar wie folgt codiert werden:
Public Sub Schreien() Schrei_was_du_willst Wecke_Herrchen (Herrchen) End Sub
Sodann ist folgende Definition einzufügen:
Protected MustOverride Sub Schrei_was_du_willst()
In der abgeleiteten Klasse "Katze" etwa wäre dann wie folgt zu codieren:
Protected Overrides Sub Schrei_was_du_willst() ' Miauen ... End Sub
Auf diese Weise ist im Sinne der Polymorphie wie der angestrebten Funktionalität das gewünschte Ergebnis erreicht: Der Hund bellt, die Katze miaut und das Herrchen wird in jedem Fall geweckt.