Heim  >  Artikel  >  Java  >  Was ist das Liskov-Substitutionsprinzip von Java-Entwurfsmustern?

Was ist das Liskov-Substitutionsprinzip von Java-Entwurfsmustern?

PHPz
PHPznach vorne
2023-04-18 16:31:03958Durchsuche

Liskov-Substitutionsprinzip, auch LSP genannt

Definition:

Funktionen, die Zeiger oder Referenzen auf Basisklassen verwenden, müssen in der Lage sein, Objekte abgeleiteter Klassen zu verwenden, ohne es zu wissen.

Alle Referenzen auf Basisklassen müssen in der Lage sein, ihre zu verwenden Unterklassenobjekte transparent darstellen.

Mit anderen Worten: Solange die übergeordnete Klasse angezeigt wird, kann die untergeordnete Klasse angezeigt werden, und das Ersetzen durch eine untergeordnete Klasse führt zu keinen Fehlern oder Ausnahmen. Aber umgekehrt kann es dort, wo Unterklassen auftreten, zu Problemen kommen, wenn sie durch übergeordnete Klassen ersetzt werden.

Dieses Prinzip besteht darin, eine Spezifikation für eine gute Vererbung zu definieren. Es hat 4 Bedeutungsebenen:

1. Die Unterklasse muss die Methoden der übergeordneten Klasse vollständig implementieren.

Definieren Sie eine abstrakte Klasse Folgende zwei Klassen dienen dazu, diese abstrakte Klasse zu implementieren

public abstract class ViewPoint {      //去丽江旅游      public abstract void where();  }

Der Charakter ist Tutu und legt den darin enthaltenen Klassentyp so fest, dass Parameter übergeben werden. Zu diesem Zeitpunkt sind die Touristenattraktionen, die Tutu besuchen möchte, noch abstrakte

public class Lijiang extends ViewPoint {         @Override     public void where() {          System.out.println("欢迎来到丽江...");      }     }   public class Zhangjiajie extends ViewPoint {         @Override     public void where() {          System.out.println("欢迎来到张家界...");      }     }

Szenarien. Legen Sie die spezifischen Attraktionen fest, zu denen Sie gehen möchten die Unterklasse der Klasse. In der Klasse können Sie andere Methoden oder Attribute definieren.

3 Beim Überschreiben oder Implementieren der Methoden der übergeordneten Klasse können die Eingabeparameter erweitert werden. Wo die übergeordnete Klasse vorhanden sein kann, ist die Unterklasse kann vorhanden sein und hat keinen Einfluss auf die laufenden Ergebnisse. Es gibt Änderungen. Das Gegenteil ist nicht der Fall.

Übergeordnete Klasse, der Parameter in say() ist vom Typ HashMap, einem Untertyp des Typs Map. (Da der Umfang der Unterklasse größer sein sollte als der der übergeordneten Klasse)

public class Tutu {      //定义要旅游的景点      private ViewPoint viewpoint;      //涂涂要去的景点      public void setViewPoint(ViewPoint viewpoint)      {          this.viewpoint = viewpoint;      }             public void travelTo()      {          System.out.println("涂涂要去旅游了");          viewpoint.where();      }  }

Für die Unterklasse werden die Parameter in say() zum Map-Typ. Der Map-Bereich ist größer als der HashMap-Typ, was mit dem LSP übereinstimmt Prinzip. Beachten Sie, dass das Sagen hier das Sagen der übergeordneten Klasse nicht überschreibt, da die Parametertypen unterschiedlich sind. Aber Überlastung.
public class Sence {      public static void main(String args[])      {          Tutu tutu = new Tutu();          //设置要去的旅游景点          tutu.setViewPoint(new Lijiang());          tutu.travelTo();      }  }

Scene-Klasse

import java.util.Collection;  import java.util.HashMap;     public class Father {      public Collection say(HashMap map)      {          System.out.println("父类被执行...");          return map.values();      }  }
Ob die Say-Methode mit der übergeordneten Klasse oder der Unterklasse aufgerufen wird, das Ergebnis ist, dass die übergeordnete Klasse ausgeführt wird ...

Wenn jedoch der say-Parameter in Father oben in Map geändert wird, Ändern Sie den Parameter say in der Unterklasse Son in HashMap, und das Ergebnis wird zu

f.say(map) Ergebnis: Die übergeordnete Klasse wird ausgeführt...s.say(map) Ergebnis: Die Unterklasse wird ausgeführt ..

Dies führt zu logischer Verwirrung. Daher müssen die Vorbedingungen der Methoden in der Unterklasse gleich oder umfassender als die überschriebenen Vorbedingungen in der übergeordneten Klasse sein.

4. Beim Überschreiben oder Implementieren der Methode der übergeordneten Klasse kann das Ausgabeergebnis reduziert werden

Tatsächlich ist es ähnlich wie oben, das heißt, die Unterklasse kann dort erscheinen, wo die übergeordnete Klasse erscheinen kann, und Das Ersetzen durch eine Unterklasse führt nicht zu Fehlern oder Ausnahmen. Der Benutzer muss nicht wissen, ob es sich um eine übergeordnete Klasse oder eine Unterklasse handelt. Aber das Gegenteil ist nicht der Fall, wo Unterklassen auftreten, die übergeordnete Klasse kann sich möglicherweise nicht anpassen. (Schließlich muss der Umfang der Unterklasse >= der Umfang der übergeordneten Klasse sein)

Das obige ist der detaillierte Inhalt vonWas ist das Liskov-Substitutionsprinzip von Java-Entwurfsmustern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen