Derived types must be completely substitutable for their base types.
To utilize the principles like inheritance, we create some class hierarchies (=extends some classes creating some derived classes).
LSP states that if a program module is using a Base class, then the reference to the Base class can be replaced with a Derived class without affecting the functionality of the program module i.e. we must make sure that the new derived classes just extend without replacing the functionality of old classes.
Otherwise, the new classes can produce undesired effects when they are used in existing program modules.
Rectangle and Square two classes are used in the Application. We extend the application and add the Square class. The square class is returned using a factory pattern, based on some conditions and we don't know the exact what type of object will be returned. But we know it's a Rectangle.
We get the rectangle object, set the width to 5 and height to 10 and get the area. For a rectangle with width 5 and height 10, the area should be 50. Instead, the result will be 100(=because rectangle class is Substituted by the Square class).