Wie bereits erwähnt, können Schnittstellen nur die öffentlich sichtbaren Methoden definieren. Ich wollte ein Beispiel zeigen, wie geschützte Methoden gehandhabt werden können. Um die Verwendung bestimmter geschützter Methoden zu erzwingen, kann eine abstrakte Klasse erstellt werden, die die Schnittstelle implementiert.
Dies ist insbesondere dann sinnvoll, wenn die abstrakte Klasse bereits einen Teil der Arbeitslast bewältigen kann, um die eigentliche Implementierung zu vereinfachen. Hier kümmert sich beispielsweise eine abstrakte Klasse um die Instanziierung des Ergebnisobjekts, das immer benötigt wird:
Zunächst die Schnittstelle.
interface iService
{
public function doSomething();
}
Die abstrakte Klasse definiert dann die interne Methodenstruktur:
abstract class AbstractService implements iService
{
public function doSomething()
{
$result = new ServiceResult();
$this->process($result);
return $result;
}
abstract protected function process($result);
}
Die Klasse, die die eigentliche Implementierung ausführt, erbt die Schnittstelle automatisch von der abstact-Klasse und muss nur die geschützte Methode implementieren.
class ExampleService extends AbstractService
{
protected function process($result)
{
$result->setSuccess('All done');
}
}
Auf diese Weise erfüllt die Schnittstelle den öffentlichen Auftrag, und durch die AbstractService
Klasse wird der interne Auftrag erfüllt. Die Anwendung muss nur die Verwendung der AbstractService
Klasse erzwingen, wo dies zutreffend ist.