DEV Community

Vivek Kurmi
Vivek Kurmi

Posted on

Liskov Substitution Principle (LSP)

The Liskov Substitution Principle is about making sure that new things you add to your code can be used just like the old things without causing any trouble. It keeps your code organized and makes it easier to add new features.

Let's break down the explanation of the Liskov Substitution Principle (LSP) into step-by-step actions with a Java code example.

Step 1: Create a Base Class and Derived Class (Initial Design):

Start with a base class and a derived class:

class Bird {
    public void fly() {
        System.out.println("Flying...");
    }
}

class Penguin extends Bird {
    public void fly() {
        System.out.println("Oops! I can't fly.");
    }
}
Enter fullscreen mode Exit fullscreen mode

In this initial design, we have a base class Bird, and a derived class Penguin, which is meant to represent a bird that cannot fly. However, the problem with this design is not immediately obvious, and it appears to follow the Liskov Substitution Principle (LSP).

Step 2: Identify the Problem:

The problem becomes apparent when we consider that a Penguin is a bird that should not be able to fly, but in the derived class, we have overridden the fly() method. This violates the Liskov Substitution Principle because it doesn't adhere to the expected behavior of the base class.

Step 3: Apply the Liskov Substitution Principle (Solution):

To adhere to the Liskov Substitution Principle, we need to change our design to make it more consistent.

Step 4: Redefine the Classes to Follow LSP (Solution):

We should create a class hierarchy that accurately represents the behavior of birds, especially birds like penguins that cannot fly:

class Bird {
    public void fly() {
        System.out.println("Flying...");
    }
}

class Penguin extends Bird {
    public void swim() {
        System.out.println("Swimming...");
    }
}
Enter fullscreen mode Exit fullscreen mode

In this corrected design, the Penguin class doesn't override the fly() method, which accurately represents that penguins cannot fly. Instead, it introduces a new method, swim(), to represent their ability to swim.

Step 5: Benefits of the Solution:

By adhering to the Liskov Substitution Principle in the corrected design, we've ensured that the derived class (Penguin) follows the expected behavior of the base class (Bird). This makes the code more consistent, predictable, and adheres to the principles of object-oriented design.

"Your feedback and ideas are invaluable – drop a comment, and let's make this even better!"

😍 If you enjoy the content, please 👍 like, 🔄 share, and 👣 follow for more updates!
Join me on a professional journey through my LinkedIn profile: Linkedin Profile

Top comments (0)