Ü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>
Dieser Code löst einen Fehler aus:
Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)
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>
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!