Heim  >  Artikel  >  Backend-Entwicklung  >  Ist das Überschreiben von Schnittstellenmethodenparametern mit untergeordneten Schnittstellen ein Verstoß gegen das Liskov-Substitutionsprinzip?

Ist das Überschreiben von Schnittstellenmethodenparametern mit untergeordneten Schnittstellen ein Verstoß gegen das Liskov-Substitutionsprinzip?

DDD
DDDOriginal
2024-11-06 09:08:02982Durchsuche

Is Overriding Interface Method Parameters with Child Interfaces a Violation of Liskov Substitution Principle?

Ü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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn