Maison >développement back-end >tutoriel php >Les interfaces enfants peuvent-elles remplacer les paramètres de méthode d'interface par des types plus spécifiques ?

Les interfaces enfants peuvent-elles remplacer les paramètres de méthode d'interface par des types plus spécifiques ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-07 10:45:03978parcourir

Can Child Interfaces Override Interface Method Parameters with More Specific Types?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn