Liskov's substitution principle (LSP) states that there is a series of properties that an object type must hold to preserve reliability on its design.
The main idea behind LSP is that, for any class, a client should be able to use any of its subtypes indistinguishably, without even noticing, and therefore without compromising the expected behavior at runtime. This means that clients are completely isolated and unaware of changes in the class hierarchy.
More formally, this is the original definition (LISKOV 01) of Liskov's substitution principle: if S is a subtype of T, then objects of type T may be replaced by objects of type S, without breaking the program.
This can be understood with the help of a generic diagram such as the following one. Imagine that there is some client class that requires (includes) objects of another type....