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 } }
public class RacingCar extends Car{ @Override public double getCabinWidth(){ //UNIMPLEMENTED } public double getCockpitWidth(){ //return the cockpit width of the racing car } }
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(); ListmyCars = 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()); } }
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 } }
public class Car extends Vehicle{ @Override public double getInteriorWidth(){ return this.getCabinWidth(); } public double getCabinWidth(){ //return cabin width } }
public class RacingCar extends Vehicle{ @Override public double getInteriorWidth(){ return this.getCockpitWidth(); } public double getCockpitWidth(){ //return the cockpit width of the racing car } }
public class VehicleUtils{ Vehicle vehicle1 = new Car(); Vehicle vehicle2 = new Car(); Vehicle vehicle2 = new RacingCar(); Listvehicles = new ArrayList<>(); vehicles.add(vehicle1); vehicles.add(vehicle2); vehicles.add(vehicle3); for(Vehicle vehicle : vehicles){ System.out.println(vehicle.getInteriorWidth()); } }
**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; } }
public class InHouseProduct extends Product{ public void applyDiscount(){ discount = discount*1.5;// 1.5 times more discount on InHouseProducts } }
public class PricingUtils{ Product p1 = new Product(); Product p2 = new Product(); Product p2 = new InHouseProduct(); Listproducts = 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()); } }
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; } }
public class PricingUtils{ Product p1 = new Product(); Product p2 = new Product(); Product p2 = new InHouseProduct(); Listproducts = new ArrayList<>(); products.add(p1); products.add(p2); products.add(p2); for(Product product : products){ System.out.println(product.getDiscount()); } }
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!