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 Bearbeiten

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 Bearbeiten

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.