Liskov Substitution Principle (LSP)
The Liskov Substitution Principle (LSP) states that objects of a superclass should be replaceable with objects of its subclasses without breaking the application. This means that subclasses should be able to fulfill the same contract as their superclass without introducing any unexpected behavior.
Here is an example of how the LSP can be violated:
public class Rectangle {
private double length;
private double width;
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
public double getArea() {
return length * width;
}
}
public class Square extends Rectangle {
public Square(double side) {
super(side, side);
}
@Override
public double getArea() {
return side * side * side; // This violates the LSP because it changes the behaviour of the `getArea` method
}
}
The Square class is a subclass of the Rectangle class. However, the getArea method of the Square class violates the LSP because it changes the behaviour of the getArea method of the Rectangle class. This means that if we substitute an object of the Square class for an object of the Rectangle class, then the program may break.
A better way to design this code would be to have the Square class return the correct area:
public class Rectangle {
private double length;
private double width;
public Rectangle(double length, double width) {
this.length = length;
this.width = width;
}
public double getArea() {
return length * width;
}
}
public class Square extends Rectangle {
public Square(double side) {
super(side, side);
}
@Override
public double getArea() {
return side * side;
}
}
This code follows the LSP because the getArea method of the Square class does not change the behaviour of the getArea method of the Rectangle class.
Top comments (0)