| Mit Polymorphismus meint man die Eigenschaft, Objekte aus anderen Objekten zu erstellen, auch Vererbung genannt. Dies wird von Visual Basic leider erst ab .NET richtig unterstützt. Die einzige Möglichkeit der Vererbung in VB 6 sind die sogenannten Interfaces. Dieses sind abstrakte Klassen, d. h. Klassen, die nur die Funktionsrümpfe enthalten. Diese Interfaces können dann von beliebigen Klassen implementiert werden. Dadurch "erbt" die Klasse alle Funktionen des Interfaces. Dies hat den Vorteil, dass sich alle Klassentypen die ein bestimmtes Interface implementiert haben, untereinander zuweisen lassen. Hier ein Beispiel dazu: Als ersten wollen wir unser Interface definieren, dazu fügen wir einem neuen Projekt eine Klasse hinzu, die wir "ITier" nennen (das "I" steht dabei für Interface). Sie soll folgenden Code enthalten: Option Explicit
Public Function Essen()
End Function
Public Function Schlafen()
End Function Listing 8: Eine abstrakte Klasse Da man aus solchen abstrakten Klassen keine Objekte erstellen kann, brauchen wir noch weitere Klassen, die dieses Interface implementieren. Deswegen fügen wir als nächstes die Klasse "Hund" hinzu. Sie enthält folgenden Code: Option Explicit
Implements ITier
Private Function ITier_Essen() As Variant
MsgBox "Der Hund isst"
End Function
Private Function ITier_Schlafen() As Variant
MsgBox "Der Hund schläft"
End Function
Public Function Beiss()
MsgBox "Der Hund beisst"
End Function Listing 9 Erklärung: - In der zweiten Zeile wird durch das Schlüsselwort Implements unser Interface eingebunden. Alle im Interface definierten Funktionsrümpfe müssen von der Hund-Klasse mit Code gefüllt, oder zumindest als leere Funktionen implementiert werden.
- Durch die neue Methode Beiss() wird der Hund spezialisiert. Er ist zwar immer noch ein Tier (weil er dieses Interface implementiert), aber er hat im Vergleich zu einem normalen Tier weitere Eigenschaften.
Da es wenig Sinn hat Interfaces zu nutzen, wenn es nur eine Klasse gibt, die dieses implementiert, definieren wir noch eine zweite, und zwar die Klasse "Katze": Option Explicit
Implements ITier
Private Function ITier_Essen() As Variant
MsgBox "Die Katze isst"
End Function
Private Function ITier_Schlafen() As Variant
MsgBox "Die Katze schläft"
End Function
Public Function Kratz()
MsgBox "Die Katze kratzt"
End Function Listing 10 Die Katze unterscheidet sich vom Hund in sofern, dass sie nicht beißen kann, dafür kann sie aber kratzen. Trotzdem bleibt sie, genau wie der Hund, aber ein Tier, weil sie ebenfalls das Interface implementiert. Jetzt müssen wir nur noch den Code unseres Formulars aufsetzten. Zunächst bekommt unser Formular 4 CommandButtons (Captions: Essen; Schlafen; Beißen; Kratzen). Dazu kommen noch zwei OptionButtons mit den Aufschriften Hund + Katze. Das ganze sieht dann in etwa so aus: Abbildung 3: Screeshot Der Code sollte so aussehen: Option Explicit
Dim Tier As ITier
Private Sub Form_Load()
Set Tier = New Hund
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Set Tier = Nothing
End Sub
Private Sub Command1_Click()
Tier.Essen
End Sub
Private Sub Command2_Click()
Tier.Schlafen
End Sub
Private Sub Command3_Click()
Dim objTempHund As Hund
If Not TypeOf Tier Is Hund Then
MsgBox "Das Tier ist kein Hund und kann nicht beißen"
Else
Set objTempHund = Tier
objTempHund.Beiss
End If
End Sub
Private Sub Command4_Click()
Dim objTempKatze As Katze
If Not TypeOf Tier Is Katze Then
MsgBox "Das Tier ist keine Katze und kann nicht kratzen"
Else
Set objTempKatze = Tier
objTempKatze.Kratz
End If
End Sub
Private Sub Option1_Click()
Set Tier = New Hund
End Sub
Private Sub Option2_Click()
Set Tier = New Katze
End Sub Listing 11 Erklärungen: Zunächst definieren wir die Variable Tier vom Typ ITier. Da dies ein Interface ist und aus diesem kein Objekt erstellt werden kann, fällt das Wort New hier weg. Stattdessen wird im Form_Load() - Ereignis ein neuer Hund instanziert. Dies ist nur dadurch möglich, dass der Hund das Interface ITier implementiert hat. Mit den beiden OptionButtons kann man zwischen einem Hund und einer Katze wählen. Mit einem Klick auf "Essen" oder "Schlafen" wird die entsprechende Funktion aus dem Interface aufgerufen, da diese dort nur deklariert, jedoch nicht definiert ist, wird es an die Klasse, die das Interface implementiert hat weitergeleitet. Also entweder an den Hund oder die Katze, je nachdem als was das Tier momentan definiert ist. Bei einem Klick auf "Beißen" wird zunächst kontrolliert, ob das Tier ein Hund oder eine Katze ist. Dies geschieht mit der VB-Funktion TypeOf. Wenn es wirklich ein Hund ist, wird unser Tier in eine spezialisierte Klasse vom Typ Hund übertragen, es bleibt jedoch die selbe Klasse, es wird dabei keine neue Klasseninstanz erstellt. Das ist nötig, da das Objekt Tier vom Typ ITier ist und die Methode Beiss() nicht kennt. Der Hund kennt diese aber, da sie in ihm definiert wurde. Der selbe Vorgang wird dann auch mit der Katze wiederholt. |