我正在努力理解 Liskov替换原则,并且我有以下代码:
class Vehicle {
}
class VehicleWithDoors extends Vehicle {
public void openDoor () {
System.out.println("Doors opened.");
}
}
class Car extends VehicleWithDoors {
}
class Scooter extends Vehicle {
}
class Liskov {
public static void function(VehicleWithDoors vehicle) {
vehicle.openDoor();
}
public static void main(String[] args) {
Car car = new Car();
function(car);
Scooter scooter = new Scooter();
//function(scooter); --> compile error
}
}
我不确定这是否违反了原则。该原则指出,如果您有一个类S的对象,则可以将其替换为类T的另一个对象,其中S是T的子类。然而,如果我写下以下代码:
Vehicle vehicle = new Vehicle();
function(vehicle);
当然,这会导致编译错误,因为Vehicle类没有openDoor()方法。但这意味着我无法用其父类Vehicle替代VehicleWithDoors对象,这似乎违反了该原则。那么,这段代码是否违反了该原则呢?我需要一个好的解释,因为我似乎无法理解它。
S
是T
的子类型,那么在代码中可以用S
替换任何T
的出现。但是不能用T
替换S
的出现。请注意不改变原意。 - Abra