OOP in PHP – Teil 10: final und abstract in der Vererbung

Neben den Standardschlüsselwörtern, die fast immer in der Vererbung vorkommen – beispielsweise extends oder parent – gibt es noch einige speziellere Ausnahmen. Diese kommen zwar vergleichsweise selten zum Zug sollten aber trotzdem behandelt werden. Sehen wir uns also final und abstract einmal genauer an.

Final legt Methoden fest

Fangen wir mit dem einfacheren an. Dank Vererbung können wir in Kindklassen die Funktionalität von Methoden aus ihrer Elternklasse überschreiben und mit neuer Funktionalität versehen. Wie immer sehen wir uns dafür natürlich direkt ein Beispiel an.

In dem Beispiel sehen wir relativ einfach wie das Überschreiben von Methoden funktioniert. Je nachdem von welcher Klasse ein Objekt erzeugt wird ruft der Interpreter automatisch die passende Methode auf.

Doch was, wenn wir verhindern möchten, dass eine bestimmte Methode überschrieben wird? Beispielsweise wenn wir unsere Klasse veröffentlichen um sie anderen Entwicklern zur Verfügung zu stellen könnte es sein, dass es nicht gewünscht ist, die Funktionalität abzuändern.

Genau dafür steht uns das Schlüsselwort final zur Verfügung. Wird eine Methode mit dem Schlüsselwort final deklariert ist sie nicht länger überschreibbar. Ändern wir oben genanntes Beispiel also folgendermaßen ab erhalten wir einen Fehler.

Bei dem Versuch, die Methode fahren() in der Klasse BMW erneut zu deklarieren, wird ein Fehler geworfen. Dank der final Deklaration in Auto wird dies verhindert.

Abstract ist gar nicht so abstrakt

Abstract stellt quasi das Gegenteil von final dar. Dieses Schlüsselwort sorgt dafür, dass wir eine Methode (oder Klasse) überschreiben müssen wenn wir keinen Fehler bekommen wollen.

Eine Klasse, die abstrakte Methoden enthält, muss auch abstrakt sein. Abstrakte Klassen können nicht instanziert werden – diese dienen also nur als Elternklasse. Diese Klassen dienen also dazu, gewisse Funktionalitäten festzulegen, die in verschiedenen Kindklassen vorhanden sein sollen.

Definieren wir eine Methode als abstract legt dies fest, dass eine Klasse, die diese Methode erbt, diese auch überschreiben muss. Eine abstrakte Methode darf keinen Methodenkörper haben, nur die sogenannte Signatur (also der Name und die Parameterliste der Methode) wird festgelegt.

Schauen wir uns ein Beispiel für eine abstrakte Klasse an.

In diesem Beispiel sehen wir mehrere Dinge.

  1. Würden wir versuchen, eine Instanz der Klasse Auto zu erzeugen (mit new Auto()) wirft PHP uns einen Fehler, da diese Klasse abstract definiert wurde.
  2. Obwohl unsere Klassen BMW und VW keine Methode fahren() definiert haben können wir diese aufrufen, da beide diese Methode von unserer Elternklasse Auto erben.
  3. Sowohl BMW als auch VW haben eine eigene Implementation von fenster_runterlassen(). Würden wir diese Definition in einer der beiden Klassen entfernen wirft PHP einen Fehler, da eine abstrakte Methode von der Kindklasse überschrieben werden muss.

Sowohl abstract als auch final sind sowohl nützliche Tools im Programmablauf als auch nützliche Kommunikationselemente für Teamwork. Wenn wir eine Klasse erstellen, die von einem anderen Entwickler benutzt werden soll, können wir ihm so mitteilen, welche Funktionalitäten genau so bleiben müssen (final) oder welche Funktionalitäten er erweitern beziehungsweise selbst definieren muss (abstract).

Ein Kommentar zu “OOP in PHP – Teil 10: final und abstract in der Vererbung

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*