Surcharge des paramètres de méthode : pièges et principes
En programmation orientée objet, l'héritage permet aux classes dérivées d'étendre ou de modifier le comportement de leur parent cours. Cependant, il existe certaines limitations lorsqu'il s'agit de remplacer les paramètres de méthode.
Considérez le code suivant, où nous avons une interface Car avec une méthode setEngine qui accepte un paramètre de type Engine. Nous avons également une interface enfant WaterCar qui étend Car et déclare une méthode différente setEngine, qui accepte un paramètre de type HydroEngine, un sous-type de Engine.
<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>
Ce code génère une erreur :
Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)
Raisonnement :
La raison de cette erreur est que WaterCar viole le principe de substitution de Liskov. Ce principe stipule que « les sous-classes doivent être substituables à leurs classes de base ». Dans ce cas, une instance WaterCar ne peut pas être remplacée par une instance Car car sa méthode setEngine a un type de paramètre différent.
Même si HydroEngine est un sous-type de Engine, il s'agit toujours d'un type différent. En remplaçant les paramètres de la méthode dans l'interface enfant, WaterCar rompt la compatibilité avec son interface parent.
Cela peut entraîner des erreurs d'exécution si le code qui attend une instance de Car reçoit une instance de WaterCar. Par exemple, le code suivant :
<code class="php">function checkEngine(Car $car) { $engine = new EngineImplementation(); $car->setEngine($engine); }</code>
Échouerait s'il était appelé avec une instance WaterCar car il ne peut pas accepter un paramètre Engine.
Conclusion :
Lors du remplacement de méthodes dans des classes dérivées, il est essentiel de maintenir la compatibilité avec la classe parent en préservant les mêmes types de paramètres. Sinon, cela peut entraîner des erreurs d'exécution et violer les principes de conception orientée objet.
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!