Maison  >  Article  >  développement back-end  >  Qu'est-ce que le principe de substitution de Richter ? (exemple)

Qu'est-ce que le principe de substitution de Richter ? (exemple)

藏色散人
藏色散人avant
2019-04-15 15:42:328352parcourir

Principe de substitution de Liskov

Principe de substitution de Liskov LSP parle de la relation entre les classes de base et les sous-classes. Ce n’est que lorsque cette relation existe que la relation de substitution de Richter existe. Si la relation entre deux classes spécifiques A et B viole la conception de LSP (en supposant qu'il s'agit d'une relation d'héritage de B vers A), alors vous pouvez choisir l'une des deux solutions de reconstruction suivantes en fonction de la situation spécifique.

<?php
//举例说明继承的风险,我们需要完成一个两数相减的功能,由类A来负责。
class a{
public $width;
public $height;
public function func1($a, $b){  
        return $a - $b;  
    }
}
$a = new a();
echo $a->func1(100,50);
//运行结果100-50=50

Plus tard, nous devrons ajouter une nouvelle fonction : compléter l'addition de deux nombres, puis additionner avec 100. La classe B en est responsable. Autrement dit, la classe B doit remplir deux fonctions :

Le code d'utilisation de la classe B pour hériter de la classe A est le suivant :

class b extends a{  
    public function func1($a, $b){  
        return $a + $b;
    }  
      
    public function func2($a, $b){  
        return $this->func1($a, $b) + 100;
    } 
}
$b = new b();
echo $b->func2(100, 50);

Supposons que la classe B remplace accidentellement la méthode du classe parent lors du nom de la méthode. , ce qui oblige tous les codes qui exécutent la fonction de soustraction à appeler la méthode réécrite de la classe B, provoquant une erreur dans la fonction fun1 qui s'exécutait normalement (la raison de l'erreur est que la soustraction est devenue une addition et les autres utilisateurs ne le savaient pas. Ne pensez pas toujours que le code a été écrit par une seule personne et tout le monde n’a pas le temps de lire votre code ligne par ligne, ils l’appliquent simplement selon les règles).

En termes simples, le principe de substitution de Liskov est le suivant : Les sous-classes peuvent étendre les fonctions de la classe parent, mais elles ne peuvent pas modifier les fonctions d'origine de la classe parent. Il contient les 4 niveaux de signification suivants :

1. Les sous-classes peuvent implémenter des méthodes abstraites de la classe parent, mais ne peuvent pas remplacer les méthodes non abstraites de la classe parent.

2. Vous pouvez ajouter vos propres méthodes uniques aux sous-classes.

3. Lorsqu'une méthode d'une sous-classe remplace une méthode d'une classe parent, les conditions préalables de la méthode (c'est-à-dire les paramètres formels de la méthode) sont plus souples que les paramètres d'entrée de la méthode de la classe parent.

4. Lorsqu'une méthode d'une sous-classe implémente une méthode abstraite d'une classe parent, les postconditions de la méthode (c'est-à-dire la valeur de retour de la méthode) sont plus strictes que celles de la classe parent.

Cela semble incroyable, car nous constaterons que nous violons souvent le principe de substitution de Liskov dans notre propre programmation, mais le programme fonctionne toujours bien. Donc tout le monde se posera cette question : quelles seront les conséquences si j’insiste pour ne pas suivre le principe de substitution de Liskov ?

La conséquence est la suivante : le risque de problèmes avec le code que vous écrivez sera considérablement augmenté.

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer