PureBasic: Polymorphismen
Es gibt Fälle, in denen soll eine erbende Klasse eine Methode neu definieren. Wenn man bei den vorhergegangen Beispiel der Menschen bleibt, könnte es passieren das der Ausgangsmensch Deutsch spricht, der neue jedoch Englisch. Man könnte nun auf die Idee kommen, die alte Methode einfach zu überschreiben.
; Listing 42: Polymorphismen OpenConsole() Class Mensch Mensch() Release() sprechen() EndClass Procedure Mensch\Mensch() EndProcedure Procedure Mensch\sprechen() PrintN("Hallo, ich bin ein Mensch") EndProcedure Class English Extends Mensch English() Release() sprechen() EndClass Procedure English\English() EndProcedure Procedure English\sprechen() PrintN("Hello, I'm a human being") EndProcedure *obj.English = NewObject English() *obj\sprechen() DeleteObject *obj Delay(2000)
Ausgabe: Hallo, ich bin ein Mensch
Wie man sieht, wird die Methode der Elternklasse aufgerufen, obwohl das Objekt von Typ English ist. Dieses Verhalten ist so gewollt. Möchte man jedoch, dass die Methode der erbenden Klasse aufgerufen wird, kommen nun die Polymorphismen ins Spiel. Polymorphie bedeutet, dass ein Ausdruck mit gleichem Bezeichner kontextabhängig interpretiert wird. Hier wurde durch den Bezeichner sprechen() die Methode der Elternklasse aufgerufen. PureObject stellt nun verschiedene Schlüsselwörter bereit, um dieses Verhalten zu ändern.
Flex und Force
BearbeitenAls erstes gibt es die Möglichkeit die Methode der Elternklasse flexibel zu gestalten, d.h. sie kann bei Bedarf von einer erbenden Klasse überschrieben werden.
; Listing 43: Flex OpenConsole() Class Mensch Mensch() Release() Flex sprechen() EndClass Procedure Mensch\Mensch() EndProcedure Procedure Mensch\sprechen() PrintN("Hallo, ich bin ein Mensch") EndProcedure Class English Extends Mensch English() Release() sprechen() EndClass Procedure English\English() EndProcedure Procedure English\sprechen() PrintN("Hello, I'm a human being") EndProcedure *obj.English = NewObject English() *obj\sprechen() DeleteObject *obj Delay(2000)
Ausgabe: Hello, I'm a human being
Durch das Schlüsselwort Flex vor der Methode sprechen() der Elternklasse wird dem Compiler gesagt, dass die Methode überschrieben werden kann.
; Listing 44: Force OpenConsole() Class Mensch Mensch() Release() sprechen() EndClass Procedure Mensch\Mensch() EndProcedure Procedure Mensch\sprechen() PrintN("Hallo, ich bin ein Mensch") EndProcedure Class English Extends Mensch English() Release() Force sprechen() EndClass Procedure English\English() EndProcedure Procedure English\sprechen() PrintN("Hello, I'm a human being") EndProcedure *obj.English = NewObject English() *obj\sprechen() DeleteObject *obj Delay(2000)
Ausgabe: Hello, I'm a human being
Die zweite Methode sieht man hier: Durch das Schlüsselwort Force zwingt man den Compiler, die Elternmethode zu überschreiben. Würde man vor letztere das Schlüsselwort Fixed schreiben, würde Force einen Compilerfehler auslösen.
Abstrakte Methoden
BearbeitenAls letztes ist es möglich eine sogenannte Abstrakte Klasse zu schreiben. Bei dieser ist es obligatorisch, dass die Methoden überschrieben werden. Man kann sich die abstrakte Klasse wie ein Schema vorstellen, an dem man sich orientieren muss.
; Listing 45: Flex OpenConsole() Class Abstract Mensch sprechen() EndClass Class English Extends Mensch English() Release() sprechen() EndClass Procedure English\English() EndProcedure Procedure English\sprechen() PrintN("Hello, I'm a human being") EndProcedure *obj.English = NewObject English() *obj\sprechen() DeleteObject *obj Delay(2000)
Ausgabe: Hello, I'm a human being
Durch das Schlüsselwort Abstract wird ausgesagt, dass die nachfolgende Klassendeklaration abstrakt ist, d.h. jeder Mensch muss eine Methode sprechen() implemetieren. Die Klasse English erbt von dieser absrakten Klasse und muss folglich die Methode sprechen() erhalten und definieren. Man beachte, dass die abstrakte Klasse keinen Konstruktor oder Destruktor hat, folglich kann man keine Objekte aus diesen Klassen erstellen. Auch werden die Methoden dieser Klasse nicht definiert.