Matti Mäkitalo: Abstrakte methoden praxistest

Beitrag lesen

Hi,

Vererbung heißt auch Overload. Eine Methode, die in der Basisklasse aus einem X ein Y macht, kann und darf in einer Subklasse aus einem X auch ein Z machen.

in PHP ist das erlaubt. Sinnvoll ist es freilich nur, wenn Z auch ein Y ist, d.h., Z von Y abgeleitet ist (bzw. Y implementiert).

interface BaseVar {
  public function meineMethode();
}

class BaseVarY implements BaseVar {
  public function meineMethode() { return 'Ich bin Y'; }
}

class BaseVarZ implements BaseVar {
  public function meineMethode() { return 'Ich bin Z'; }
}

class Base {

/**
   * @return Y y-from-x
   */
  public function getObject(X $x) {
     return new BaseVarY();
  }
}

class Derived extends Base {

/**
   * @return Z y-from-x
   */
  public function getObject(X $x) {
     return new BaseVarZ();
  }
}

$obj = rand() % 2 ? new Base() : new Derived();
// es ist zufällig, ob $obj->getObject() ein BaseVarY oder ein BaseVarZ ist.
// ich kann mir aber sicher sein, dass das zurückgegebene Object die Methode 'meineMethode' hat.
echo $obj->meineMethode();

Es bringt nur potentielle Fehlerquellen, OOP anders zu verwenden.
Die Basisklasse beschreibt ein Mindestinterface, an dass sich Kindklassen zu halten haben.
Hat die Basisklasse eine Methode, welche ein X verlangt und ein Y zurückgibt, dann muss jedes overload dieser Methode ein X oder ein parent von X verlangen (es darf die Forderung also relaxieren auf Vaterklassen), und muss ein Y oder eine Kindklasse von Y zurückgeben (also den Werteraum einschränken).

Nur weil in PHP (ohne Benutzung von Type-Hinting) mehr erlaubt ist, sollte man es schon lange nicht tun.

Bis die Tage,
Matti