Le remplacement des paramètres de méthode d'interface par des interfaces enfants constitue-t-il une violation du principe de substitution de Liskov ?

DDD
Libérer: 2024-11-06 09:08:02
original
982 Les gens l'ont consulté

Is Overriding Interface Method Parameters with Child Interfaces a Violation of Liskov Substitution Principle?

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

Malheureusement, ce code produit l'erreur :

Fatal error: Declaration of WaterCar::setEngine() must be compatible with Car::setEngine(Engine $engine)
Copier après la connexion

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!