Derived types must be completely substitutable for their base types.
A class should have only one reason to change.
Clients should not be forced to depend upon interfaces that they don’t use.
High-level modules should not depend on low-level modules. Both should depend on abstractions. Abstractions should not depend on details. Details should depend on abstractions.
Software entities like classes, modules and functions should be open for extension but closed for modifications.