Maison > Problème commun > le corps du texte

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

青灯夜游
Libérer: 2020-07-28 12:01:12
original
6249 Les gens l'ont consulté

Le principe de substitution de Liskov est l'un des principes de base de la conception orientée objet. Il préconise l'utilisation de « l'abstraction » et du « polymorphisme » pour changer la structure statique de la conception en une structure dynamique afin de maintenir la stabilité de la conception. conception. « L'abstraction » est une fonction fournie par le langage, et le « polymorphisme » est implémenté par la sémantique d'héritage.

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

Le principe de substitution de Liskov (LSP) a été proposé par Mme Liskov du laboratoire d'informatique du MIT en 1987. Il a été proposé dans un article « Data Abstraction and Hiérarchie" publié lors de la "Object-Oriented Technology Summit Conference" (OOPSLA). Elle a proposé que l'héritage doit garantir que les propriétés détenues par la superclasse sont dans la sous-classe. L'héritage doit garantir que toute propriété prouvée sur les objets de supertype est également valable pour les objets de sous-type. .

Le principe de substitution de Liskov explique principalement certains principes concernant l'héritage, c'est-à-dire quand l'héritage doit être utilisé, quand l'héritage ne doit pas être utilisé, et les principes qui le sous-tendent. La substitution de Liskov est à l'origine la base de la réutilisation de l'héritage. Elle reflète la relation entre les classes de base et les sous-classes, complète le principe d'ouverture et de fermeture et régule les étapes spécifiques pour réaliser l'abstraction.

La fonction du principe de substitution de Liskov

Les principales fonctions du principe de substitution de Liskov sont les suivantes.

1. Le principe de substitution de Liskov est l'un des moyens importants de réaliser le principe d'ouverture et de fermeture.

2. Il surmonte les inconvénients d'une mauvaise réutilisabilité causée par le remplacement des classes parentales dans l'héritage.

3. C'est la garantie de la justesse de l'action. Autrement dit, l’extension de la classe n’introduira pas de nouvelles erreurs dans le système existant, réduisant ainsi le risque d’erreurs de code.

Comment implémenter le principe de substitution de Liskov

Le principe de substitution de Liskov signifie généralement : les sous-classes peuvent étendre les fonctions de la classe parent, mais elles ne peuvent pas modifier les caractéristiques originales de la fonction parent. En d'autres termes : lorsqu'une sous-classe hérite d'une classe parent, essayez de ne pas remplacer les méthodes de la classe parent, sauf en ajoutant de nouvelles méthodes pour compléter de nouvelles fonctions.

Si vous réécrivez la méthode de la classe parent pour compléter la nouvelle fonction, bien qu'elle soit simple à écrire, la réutilisation de l'ensemble du système d'héritage sera relativement faible, surtout lorsque le polymorphisme est fréquemment utilisé, le programme exécutera le la probabilité d'erreur est très élevée.

Si le programme viole le principe de substitution de Liskov, l'objet de la classe héritée aura une erreur d'exécution là où la classe de base apparaît. À l'heure actuelle, la méthode de correction est la suivante : annuler la relation d'héritage d'origine et repenser la relation entre elles.

Quant à l'exemple du principe de substitution de Liskov, le plus connu est "un carré n'est pas un rectangle". Bien sûr, il existe de nombreux exemples similaires dans la vie. Par exemple, les manchots, les autruches et les kiwis sont classés comme des oiseaux d'un point de vue biologique ; mais d'un point de vue héréditaire, car ils ne peuvent pas hériter de la capacité des « oiseaux » à voler, ils ne peuvent pas être définis comme des sous-classes de « oiseau ». De même, puisque le « poisson ballon » ne peut pas nager, il ne peut pas être défini comme une sous-catégorie de « poisson » ; le « canon jouet » ne peut pas faire exploser les ennemis, il ne peut donc pas être défini comme une sous-catégorie de « canon », etc.

Ce qui suit utilise "Le kiwi n'est pas un oiseau" comme exemple pour illustrer le principe de substitution de Richter.

[Exemple 2] Application du principe de substitution de Richter dans l'exemple de "Le kiwi n'est pas un oiseau".

Analyse : Les oiseaux volent généralement. Par exemple, la vitesse de vol des hirondelles est d'environ 120 kilomètres par heure. Mais les kiwis de Nouvelle-Zélande sont incapables de voler à cause de leurs ailes dégénérées. Supposons que vous souhaitiez concevoir un exemple et calculer le temps nécessaire à ces deux oiseaux pour parcourir 300 kilomètres. Évidemment, si vous utilisez une hirondelle pour tester ce code, le résultat est correct et le temps requis peut être calculé, mais si vous utilisez un kiwi pour le tester, le résultat sera une "exception de division par zéro" ou "infini", ce qui n'est évidemment pas conforme aux attentes. Le diagramme de classes Comme le montre la figure 1.

Quest-ce que le principe de substitution de Richter ?

Le code du programme est le suivant :

package principle;
public class LSPtest
{
    public static void main(String[] args)
    {
        Bird bird1=new Swallow();
        Bird bird2=new BrownKiwi();
        bird1.setSpeed(120);
        bird2.setSpeed(120);
        System.out.println("如果飞行300公里:");
        try
        {
            System.out.println("燕子将飞行"+bird1.getFlyTime(300)+"小时.");
            System.out.println("几维鸟将飞行"+bird2.getFlyTime(300)+"小时。");
        }
        catch(Exception err)
        {
            System.out.println("发生错误了!");
        }
    }
}
//鸟类
class Bird
{
    double flySpeed;
    public void setSpeed(double speed)
    {
        flySpeed=speed;
    }
    public double getFlyTime(double distance)
    {
        return(distance/flySpeed);
    }
}
//燕子类
class Swallow extends Bird{}
//几维鸟类
class BrownKiwi extends Bird
{
    public void setSpeed(double speed)
    {
           flySpeed=0;
    }
}
Copier après la connexion

Le résultat d'exécution du programme est le suivant :

如果飞行300公里:
燕子将飞行2.5小时.
几维鸟将飞行Infinity小时。
Copier après la connexion

La raison du L'erreur d'exécution du programme est : kiwi bird. La méthode setSpeed ​​(double speed) des oiseaux a été remplacée, ce qui viole le principe de substitution de Liskov. L'approche correcte consiste à annuler la relation d'héritage originale du kiwi et à définir une classe parente plus générale de l'oiseau et du kiwi, telle que la classe animale, qui ont toutes deux la capacité de courir. Bien que la vitesse de vol du Kiwi soit de 0, sa vitesse de course n'est pas de 0. Vous pouvez calculer le temps qu'il faut pour parcourir 300 kilomètres.

Le diagramme de classes est présenté dans la figure 2.

Quest-ce que le principe de substitution de Richter ?

Pour plus de connaissances connexes, veuillez visiter : Site Web PHP chinois !

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!

Étiquettes associées:
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