Hauptmenü

Untermenü

OOP PHP5 - Techniken - Überschreiben

1. Einführung

Überschreiben bedeutet, dass man in Kindklassen Methoden oder Eigenschaften der Eltern- beziehungsweise Großelternklasse anpassen bzw. ändern kann. Ich will das an folgendem etwas sinnfreiem Beispiel erklären (nicht rumnörgeln, immer die richtigen Beispiele für Anfänger zu finden, ist extrem schwer).

2. Das Beispiel

Bevor sich Dieter und Dörte zu ihrem ersten Rendezvous treffen, machen sie was? Genau, sie betreiben Körperpflege! Allerdings unterscheidet die sich sehr stark bei den Geschlechtern. Der Basiscode:


class Mensch
{
  private $gewaschen;
  private function koerperpflege ($wert)
  {
    $this -> gewaschen $wert;
  }
  public function returnPflege ($wert)
  {
    $this -> koerperpflege ($wert);
    return $this -> gewaschen;
  }
}

class Mann extends Mensch
{

}

$dieter = new Mann;
echo 'Dieter: <br>Folgendes Körperpflegemittel wurde benutzt: ';
$benutzt $dieter -> returnPflege('Seife');
echo $benutzt;

Erläuterung

Ist ganz einfach. Die Klasse Mann erbt die Methoden und Eigenschaften der Klasse Mensch. Nun ist es bei Männern so [Ironie], dass sie bei der Körperpflege deutlich weniger Aufwand betreiben als Frauen. In diesem Fall arbeiten wir bei den Pflegemitteln nur mit einem Wert.

Obiger Code ist ehrlich gesagt nicht besonders sinnvoll in seinem Aufbau. Ich will aber nur (mal wieder) das Prinzip erläutern. Also bitte generell nicht so programmieren, wie ich es gerade getan habe.

3. Überschreiben

So, wir gehen jetzt einfach mal davon aus, dass in unserer Programmierung Männer die Hauptrolle spielen und Frauen nur am Rande auftauchen. Das hat zwar mit dem realen Leben nichts zu tun, ist aber im Moment egal.

Im Gegensatz zu Männern benutzen Frauen nicht nur einfache Seife, nein, die haben ein rieeeeesiges Sammelsurium von Utensilien. Leider sehen unsere Methoden und Eigenschaften das nicht vor. Also kann man das für diesen "Ausnahmefall" entsprechend anpassen.


class Frau extends Mensch
{
  private $gewaschen = array();
  private function koerperpflege ($wert)
  {
    foreach ($wert as $value)
    {
      $this -> gewaschen[] = $value;
    }
    return $this -> gewaschen;
  }
}

Erläuterung

$gewaschen wurde in der Klasse Mensch als stinknormale Variable definiert. Da das aber bei Frauen nicht ausreicht, haben wir den Typ in der Klasse Frau als Array festgelegt. Damit "überschreiben" wir die Variable aus der Klasse Mensch. Um die aber nun verarbeiten zu können, müssen wir das auch bei der entsprechenden Methode tun. Die Verarbeitung sieht dann so aus:


$doerte = new Frau;
$benutzt $doerte -> returnPflege(
                                    array (
                                            'Deo',
                                            'Haarwaschmittel',
                                            'Pflegecreme',
                                            'Hautbalsam'));

echo 'Dörte: <br>Folgende Körperpflegemittel wurden benutzt: ';
print_r ($benutzt);

4. Sichtbarkeit

Die zu überschreibenden Eigenschaften und Methoden müssen mindestens über dieselbe Sichtbarkeitsstufe verfügen wie das Original. Definiert man zum Beispiel in der Klasse Mensch die Variable $gewaschen als protected, so darf man in der Klasse Frau sie nicht als private deklarieren. In diesem Fall wäre die Sichtbarkeit in der Kindklasse geringer als in der Elternklasse. Dasselbe gilt natürlich auch für die Methoden.

5. Einsatzmöglichkeiten

In was für Situationen sollte man nun etwas überschreiben? In Frage dafür kämen zum Beispiel Frameworks, wo man bestimmte Klassen den eigenen Bedürfnisse anpassen möchte. Oder man greift auf eine bereits existierende Software-Lösung zu, und will nicht den Core, also den Kern der Anwendung modifizieren, damit einem beim nächsten Update nicht alles um die Ohren fliegt. Außerdem sollte man diese Technik in komplett eigenen Anwendungen nur sehr begrenzt einsetzen, da man sonst meiner Meinung nach einen Designfehler begangen hat.

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt