Heim > Artikel > Backend-Entwicklung > Ist das Überschreiben von Schnittstellenmethodenparametern mit untergeordneten Schnittstellen ein Verstoß gegen das Liskov-Substitutionsprinzip?
Überschreiben von Schnittstellenmethodenparametern: Ein Fall einer Liskov-Substitutionsverletzung
In PHP kann es vorkommen, dass Sie einen Schnittstellenmethodenparameter mit überschreiben Eine untergeordnete Schnittstelle führt zu einem Fehler. Betrachten Sie den folgenden Code:
<code class="php">interface Engine { function run(); } interface HydroEngine extends Engine { function run(); } interface Car { function setEngine(Engine $engine); } interface WaterCar extends Car { function setEngine(HydroEngine $engine); }</code>
Leider erzeugt dieser Code den Fehler:
Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)
Grund für den Fehler
Der Fehler tritt auf denn durch das Überschreiben der setEngine-Methode in der WaterCar-Schnittstelle verstoßen Sie gegen das Liskov-Substitutionsprinzip. Dieses Prinzip besagt, dass eine Unterklasse für ihre übergeordnete Klasse ersetzbar sein sollte, ohne das Verhalten des Programms zu beeinträchtigen.
Die WaterCar-Schnittstelle muss als Unterklasse von Car denselben Parametertyp akzeptieren wie die setEngine-Methode der übergeordneten Schnittstelle Motor. Indem Sie es mit HydroEngine überschreiben, schränken Sie den akzeptablen Parametertyp ein, wodurch WaterCar weniger ersetzbar ist als Car.
Lösung
Um dieses Problem zu beheben, müssen Sie sicherstellen, dass die Unterklassen einer Schnittstelle unterliegen denselben Parametertypen wie die übergeordnete Schnittstelle. In diesem Fall sollten Sie die setEngine-Methode in der WaterCar-Schnittstelle nicht überschreiben, sondern stattdessen die Definition der Car-Schnittstelle erben.
Das obige ist der detaillierte Inhalt vonIst das Überschreiben von Schnittstellenmethodenparametern mit untergeordneten Schnittstellen ein Verstoß gegen das Liskov-Substitutionsprinzip?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!