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
Libérer: 2024-11-07 10:45:03
original
938 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal