Definition

It states that Objects of a superclass should be replaceable with the objects of a subclass without affecting the correctness of the program.

“If S is a subclass of T, then an object of class T should be replaceable with an object of class S without altering the desirable properties of the program.”

Example

center

bird is an Object of Bird()

class Bird:
    def fly(self):
        pass
 
class Sparrow(Bird):
    def fly(self):
        print("Sparrow is flying")
 
class Ostrich(Bird):
    def fly(self):
        raise ValueError("Ostrich cannot fly")
 
bird = Bird()
sparrow = Sparrow()
ostrich = Ostrich()
 
def make_bird_fly(bird):
    bird.fly()
 
make_bird_fly(sparrow)  # This works as expected, Sparrow can fly
make_bird_fly(ostrich)  # As expected, this raises an exception - Ostrich can't fly

References

Vimdot code

digraph G {
    rankdir=BT;  // Top-to-bottom layout
 
    // Nodes (Classes and Function)
    Bird [shape=box, label="Bird"];
    Sparrow [shape=box, label="Sparrow"];
    Ostrich [shape=box, label="Ostrich"];
    make_bird_fly [shape=diamond, style=filled, color=lightblue, label="make_bird_fly(bird)"];
 
    // Edges (Inheritance and Function Calls)
    Sparrow -> Bird;
    Ostrich -> Bird [label="inherits"];
    make_bird_fly -> Bird [style=dashed, label="calls"];
    make_bird_fly -> Sparrow [style=dashed];
    make_bird_fly -> Ostrich [style=dashed];
}