Liskov Substitution Princple, LSP
For every object "o1" from type "t1", there is object "o2" from type "t2", when all "o2" is replaced with "o1" in program "p" defined in T1, the program behavior of "p" doesn't change, therefore, type "t2" is the sub type of "t1"
it looks like the structure in the program.
class FruitInventory { void AddFruit(Fruit p) { } } class Apple : Fruit { } static void Main() { FruitInventory fruitInvt = new FruitInventory(); fruitInvt.AddFruit(new Apple()); }