Mehrere Schnittstellen in OOP in PHP
In PHP gibt es keine Mehrfachvererbung - jede
Klasse kann nur einen Elternteil haben.
Bei Schnittstellen verhält es sich jedoch anders:
jede Klasse kann beliebig viele Schnittstellen
implementieren. Dazu müssen die Namen der Schnittstellen
nach dem Schlüsselwort implements
aufgelistet werden, getrennt durch Kommas.
Hierin zeigt sich ein weiterer Unterschied zwischen Schnittstellen und abstrakten Klassen - man kann viele Schnittstellen implementieren, aber nicht mehrere abstrakte Klassen vererben.
Probieren wir es praktisch aus. Nehmen wir an, wir haben neben
der Schnittstelle iFigure auch die
Schnittstelle iTetragon.
Die Methoden dieser Schnittstelle werden von den
Klassen Quadrate und Rectangle implementiert,
da sie 4 Seiten haben, aber nicht von der Klasse
Disk.
Nehmen wir an, die Schnittstelle iTetragon beschreibt
Getter für alle vier Seiten eines
Vierecks:
<?php
interface iTetragon
{
public function getA();
public function getB();
public function getC();
public function getD();
}
?>
Nehmen wir weiter an, wir haben die Schnittstelle iFigure,
die wir bereits früher erstellt haben:
<?php
interface iFigure
{
public function getSquare();
public function getPerimeter();
}
?>
Sorgen wir dafür, dass die Klasse Quadrate
zwei Schnittstellen implementiert. Dazu listen wir
beide Schnittstellen nach dem Schlüsselwort
implements auf, getrennt durch ein Komma:
<?php
class Quadrate implements iFigure, iTetragon
{
// hier folgt die Implementierung
}
?>
Erweitern wir nun unsere Klasse Quadrate so,
dass sie die Schnittstelle iTetragon implementiert.
Es ist klar, dass unser Quadrat ein degenerierter Fall
eines Vierecks ist, da beim Quadrat
alle Seiten gleich sind. Daher werden alle neuen Methoden
dasselbe zurückgeben - die Breite des Quadrats:
<?php
class Quadrate implements iFigure, iTetragon
{
private $a;
public function __construct($a)
{
$this->a = $a;
}
public function getA()
{
return $this->a;
}
public function getB()
{
return $this->a;
}
public function getC()
{
return $this->a;
}
public function getD()
{
return $this->a;
}
public function getSquare()
{
return $this->a * $this->a;
}
public function getPerimeter()
{
return 4 * $this->a;
}
}
?>
Es ist offensichtlich, dass in einem Rechteck nicht alle
Seiten gleich sind, sondern nur die gegenüberliegenden.
In diesem Fall würden sich die neuen Methoden leicht
unterscheiden. Und in einem Trapez wären
überhaupt alle 4 Seiten unterschiedlich.
Es spielt jedoch keine Rolle, welche Figur wir betrachten - wichtig ist, dass all diese Figuren die beschriebenen Methoden haben werden (auch wenn einige Figuren degeneriert sind) und einheitlich funktionieren.
Sorgen Sie dafür, dass die Klasse Rectangle
auch zwei Schnittstellen implementiert: sowohl iFigure
als auch iTetragon.
Erstellen Sie die Schnittstelle iCircle mit den Methoden
getRadius und getDiameter.
Sorgen Sie dafür, dass die Klasse Disk auch
zwei Schnittstellen implementiert: sowohl iFigure
als auch iCircle.