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
Als 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
Als 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.