Remplacer les paramètres de la méthode d'interface avec les interfaces enfants
Dans le code PHP donné, une tentative est faite pour remplacer la méthode setEngine de l'interface Car avec un type de paramètre plus spécifique dans l'interface enfant WaterCar. Cependant, cela entraîne une erreur fatale :
<code class="php">Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)</code>
Explication de l'erreur
L'erreur provient d'une violation du principe de substitution de Liskov (LSP), qui stipule qu'un sous-type doit être substituable à son surtype. Dans ce cas, l'interface WaterCar est un sous-type de l'interface Car, mais la méthode setEngine dans WaterCar a un type de paramètre différent (HydroEngine) que la méthode correspondante dans Car (Engine).
Cela crée un problème de compatibilité. . Une classe qui implémente l'interface WaterCar peut ne pas pouvoir être transmise comme argument aux fonctions qui attendent un objet Car, car la méthode setEngine n'acceptera pas de paramètre Engine. Par conséquent, la sous-classe ne remplit pas toutes les exigences de la superclasse, ce qui interrompt le LSP.
Résolution
Pour résoudre ce problème, la méthode setEngine dans l'interface WaterCar doit maintenir la compatibilité avec la méthode dans l’interface Car. Cela signifie conserver le même type de paramètre (Engine) ou fournir un type plus général incluant Engine, tel que Vehicle.
<code class="php">interface WaterCar extends Car { function setEngine(Vehicle $engine); }</code>
Avec ce changement, toute classe implémentant WaterCar peut toujours être utilisée dans les endroits où un Car est attendu, car il accepte désormais un paramètre du même type ou d'un type plus général.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!