A Class should have only one reason to change.
Software entities such as classes, functions, and modules should be open for extension but closed for modification.
Child classes should never break the parent class’ type definitions.
Any higher classes should always depend upon the abstraction of the class rather than the detail.