The Liskov Substitution Principle (LSP) is an important concept in object-oriented design. It states:
“Objects of a superclass should be replaceable with objects of a subclass without affecting the correctness of the program.”
This principle means that a subclass should behave in a way that it can substitute for its parent class without causing issues in the system. If a subclass breaks the behavior expected from the parent class, it violates LSP.
Problem Example: Car and Electric Car
Let’s take a simple example of a Car class to see where the problem arises when LSP is violated.

- Imagine you have a
Carclass with methods to start, stop, and refuel the car. - Now, you decide to extend this class and create an
ElectricCarclass. This class should also start and stop like a regular car, but since it doesn’t use fuel, therefuel()method becomes problematic. - Instead
ElectricCarclass hasrecharge()method.
In this example, the ElectricCar class overrides the refuel() method from the Car class, but it cannot implement the functionality properly because electric cars don’t use fuel. This leads to an issue where calling the refuel() method on an ElectricCar will break the program by throwing an exception.
Why Previous Example Violates LSP?
According to the Liskov Substitution Principle, we should be able to replace an instance of Car with an instance of ElectricCar without breaking the functionality. However, let’s see what happens when we create objects of these classes and call their methods.
In this example:
-
We create an instance of the
Carclass and everything works as expected. -
We then create an instance of the
ElectricCarclass, but treat it as aCar(sinceElectricCaris a subclass ofCar). -
When we call the
refuel()method on theElectricCarobject, it throws anUnsupportedOperationExceptionbecause electric cars don’t use fuel. This breaks the program.
The Actual Reason Behind the Violation of LSP
This behavior violates the Liskov Substitution Principle because:
- We cannot seamlessly substitute an instance of the
Carclass with an instance ofElectricCarwithout breaking the program. - The
ElectricCarclass cannot fulfill the contract of theCarclass, specifically regarding therefuel()method.
In this lesson, we’ve seen how trying to treat ElectricCar as a Car leads to issues when the expected behavior of the parent class isn’t respected by the subclass. In the next lesson, we will explore how to properly redesign the system to adhere to LSP.