Heim> Java> javaLernprogramm> Hauptteil

Liskov-Substitutionsprinzip

PHPz
Freigeben: 2024-08-25 22:30:36
Original
949 Leute haben es durchsucht

Liskov Substitution Principle

Objekte sollten durch ihren Untertyp ersetzbar sein, ohne die Richtigkeit des Codes zu beeinträchtigen

Lassen Sie uns dies mit der Vererbung (Ist-eineBeziehung) verstehen
Beispiel: Strauß ist ein Vogel, Glöckner ist ein Auto usw.

Beispiel: Rennwagen ist ein Auto

public class Car{ public double getCabinWidth(){ //return cabin width } }
Nach dem Login kopieren
public class RacingCar extends Car{ @Override public double getCabinWidth(){ //UNIMPLEMENTED } public double getCockpitWidth(){ //return the cockpit width of the racing car } }
Nach dem Login kopieren

RacingCar überschreibt getCabinWidth() der Autoklasse, lässt es aberunimplementiert, weil Rennwagen keine Kabinenbreite haben (wenn Sie einen Formel-1-Rennwagen sehen, hat er keinen Innenraum, sondern nur einen Cockpit, in dem der Fahrer sitzt)
Daher wird der Innenraum eines Rennwagens als Cockpit bezeichnet.
Hinweis: Rennwagen haben einige Spezifikationen, die möglicherweise nicht mit denen des generischen Autos übereinstimmen

public class CarUtil{ Car car1 = new Car(); Car car2 = new Car(); Car car3 = new RacingCar(); List myCars = new ArrayList<>(); myCars.add(car1); myCars.add(car2); myCars.add(car3); // this will not work in 3rd iteration, because the getCabinWidth() in RacingCar is not implemented for(Car car : myCars){ System.out.println(car.getCabinWidth()); } }
Nach dem Login kopieren

Dies ist ein Design, das offengelegt wurde, da die for-Schleife bei der dritten Iteration fehlschlägt.
Um dies zu beheben, müssen wir an der Wurzel ansetzen, nämlich der Vererbung selbst.


Lösung 1: (Die Hierarchie durchbrechen)

Wir müssen die Vererbung auflösen, stattdessen werden wir ein gemeinsames übergeordnetes Element für Auto und Rennwagen finden

Wir werden eine sehr allgemeine übergeordnete Klasse namens Vehicle erstellen

public class Vehicle{ public double getInteriorWidth(){ //return the interior width } }
Nach dem Login kopieren
public class Car extends Vehicle{ @Override public double getInteriorWidth(){ return this.getCabinWidth(); } public double getCabinWidth(){ //return cabin width } }
Nach dem Login kopieren
public class RacingCar extends Vehicle{ @Override public double getInteriorWidth(){ return this.getCockpitWidth(); } public double getCockpitWidth(){ //return the cockpit width of the racing car } }
Nach dem Login kopieren
public class VehicleUtils{ Vehicle vehicle1 = new Car(); Vehicle vehicle2 = new Car(); Vehicle vehicle2 = new RacingCar(); List vehicles = new ArrayList<>(); vehicles.add(vehicle1); vehicles.add(vehicle2); vehicles.add(vehicle3); for(Vehicle vehicle : vehicles){ System.out.println(vehicle.getInteriorWidth()); } }
Nach dem Login kopieren

**Durchbrechen der Hierarchie: Durchbrechen der Hierarchie, wenn die Vertretung fehlschlägt


Lösung 2:Sag es, frag nicht

Nehmen wir ein weiteres Beispiel von Amazon
Amazon bietet x Rabatt auf alle Produkte von Drittanbietern.
Und bietet das 1,5-fache auf alle hauseigenen Produkte (Amazon BasicsProdukte sind Amazon-eigene Produkte)

public class Product{ public double discount = 20;//x amount of discount on all the third-party products on Amazon public double getDiscount(){ return discount; } }
Nach dem Login kopieren
public class InHouseProduct extends Product{ public void applyDiscount(){ discount = discount*1.5;// 1.5 times more discount on InHouseProducts } }
Nach dem Login kopieren
public class PricingUtils{ Product p1 = new Product(); Product p2 = new Product(); Product p2 = new InHouseProduct(); List products = new ArrayList<>(); products.add(p1); products.add(p2); products.add(p2); for(Product product : products){ if(product instanceOf InHouseProduct){ ((InHouseProduct)product).applyDiscount(); } System.out.println(product.getDiscount()); } }
Nach dem Login kopieren

Beachten Sie, dass die if-Anweisung an der Aktualisierung des Rabattbetrags von InHouseProduct beteiligt ist, was „gegen das Liskov-Substitutionsprinzip“ verstößt (da wir das Objekt „Product“ durch seinen Untertyp „InHouseProduct“ hätten ersetzen können), aber hier in der if-Anweisung müssen wir dies manuell tun Aktualisierung des Rabattbetrags, was nicht erfolgen sollte.Eine geringfügige Änderung in der InHouseProduct-Klasse wird dieses Problem beheben

public class InHouseProduct extends Product{ @Override public double getDiscount(){ applyDiscount(); return discount; } public void applyDiscount(){ discount = discount*1.5; } }
Nach dem Login kopieren

Und schließlich das Entfernen der if-Anweisung aus der PricingUtils-Klasse

public class PricingUtils{ Product p1 = new Product(); Product p2 = new Product(); Product p2 = new InHouseProduct(); List products = new ArrayList<>(); products.add(p1); products.add(p2); products.add(p2); for(Product product : products){ System.out.println(product.getDiscount()); } }
Nach dem Login kopieren

Sagen Sie, fragen Sie nicht: Hier weisen wir die Utils-Klasse an, alle Rabatte auszudrucken, und die Utils-Klasse muss nichts fragen (wie zuvor in der if-Anweisung gefragt)


Das obige ist der detaillierte Inhalt vonLiskov-Substitutionsprinzip. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!