Remplacement des paramètres de méthode d'interface : un cas de violation de substitution Liskov
En PHP, vous pouvez rencontrer une situation où le remplacement d'un paramètre de méthode d'interface par une interface enfant entraîne une erreur. Considérez le code suivant :
<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>
Malheureusement, ce code produit l'erreur :
Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)
Raison de l'erreur
L'erreur se produit car en remplaçant la méthode setEngine dans l'interface WaterCar, vous violez le principe de substitution de Liskov. Ce principe stipule qu'une sous-classe doit être substituable à sa classe parent sans perturber le comportement du programme.
L'interface WaterCar, en tant que sous-classe de Car, doit accepter le même type de paramètre que la méthode setEngine de l'interface parent, qui est Moteur. En le remplaçant par HydroEngine, vous réduisez le type de paramètre acceptable, rendant WaterCar moins substituable que Car.
Solution
Pour résoudre ce problème, vous devez vous assurer que le les sous-classes d'une interface adhèrent aux mêmes types de paramètres que l'interface parent. Dans ce cas, vous ne devez pas remplacer la méthode setEngine dans l'interface WaterCar, mais plutôt hériter de la définition de l'interface Car.
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!