A class should have only one reason to change.
Software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification.
Let q(x) be a property provable about objects x of type T. Then q(y) should be provable for objects y of type S where S is a subtype of T
in simple terms:
Child classes should never break the parent class' type definitions.
Implement a Score-System for a turned-based game (like Poker) (The game(s) can be stubbed)