Warum kann ich Methodenparameter in untergeordneten Schnittstellen in PHP nicht überschreiben?

Mary-Kate Olsen
Freigeben: 2024-11-08 01:38:02
Original
332 Leute haben es durchsucht

Why Can't I Override Method Parameters in Child Interfaces in PHP?

Überschreiben von Methodenparametern: Fallstricke und Prinzipien

In der objektorientierten Programmierung ermöglicht die Vererbung abgeleiteten Klassen, das Verhalten ihrer übergeordneten Klassen zu erweitern oder zu ändern Klassen. Beim Überschreiben von Methodenparametern gibt es jedoch gewisse Einschränkungen.

Betrachten Sie den folgenden Code, in dem wir eine Schnittstelle Car mit einer Methode setEngine haben, die einen Parameter vom Typ Engine akzeptiert. Wir haben auch eine untergeordnete Schnittstelle WaterCar, die Car erweitert und eine andere Methode setEngine deklariert, die einen Parameter vom Typ HydroEngine, einem Untertyp von Engine, akzeptiert.

<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>
Nach dem Login kopieren

Dieser Code löst einen Fehler aus:

Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)
Nach dem Login kopieren

Begründung:

Der Grund für diesen Fehler ist, dass WaterCar gegen das Liskov-Substitutionsprinzip verstößt. Dieses Prinzip besagt, dass „Unterklassen durch ihre Basisklassen ersetzbar sein müssen“. In diesem Fall kann eine WaterCar-Instanz nicht durch eine Car-Instanz ersetzt werden, da ihre setEngine-Methode einen anderen Parametertyp hat.

Obwohl HydroEngine ein Untertyp von Engine ist, handelt es sich dennoch um einen anderen Typ. Durch das Überschreiben der Methodenparameter in der untergeordneten Schnittstelle unterbricht WaterCar die Kompatibilität mit seiner übergeordneten Schnittstelle.

Dies kann zu Laufzeitfehlern führen, wenn Code, der eine Car-Instanz erwartet, an eine WaterCar-Instanz übergeben wird. Zum Beispiel der folgende Code:

<code class="php">function checkEngine(Car $car) {
    $engine = new EngineImplementation();
    $car->setEngine($engine);
}</code>
Nach dem Login kopieren

Würde fehlschlagen, wenn er mit einer WaterCar-Instanz aufgerufen würde, da er keinen Engine-Parameter akzeptieren kann.

Schlussfolgerung:

Beim Überschreiben von Methoden in abgeleiteten Klassen ist es wichtig, die Kompatibilität mit der übergeordneten Klasse aufrechtzuerhalten, indem dieselben Parametertypen beibehalten werden. Andernfalls kann es zu Laufzeitfehlern kommen und objektorientierte Designprinzipien verletzen.

Das obige ist der detaillierte Inhalt vonWarum kann ich Methodenparameter in untergeordneten Schnittstellen in PHP nicht überschreiben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!