The Liskov substitution principle (LSP) states: Objects of a superclass should be replaceable with objects of its subclasses without breaking the application.

In simple terms: A child class must behave exactly like its parent class, so it doesn't surprise the system. If your code expects a generic parent type, you should be able to pass any child variant into it without causing errors, crashes, or weird behaviors.

Keep in mind: Model your classes based on behaviours not on properties. Model your data based on properties and not on behaviours.

The Real-World Example: Think of a TV remote control that runs on standard AA batteries

The Expectation (Parent): The remote expects a standard AA battery. It assumes the battery will fit the slot, provide 1.5 volts of power, and have a positive and negative terminal.