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