Note that most of the game consists of different types of card piles.
We abstract the common behavior and place it into a parent class
(for example, managing the pile of cards).
We use overriding to specialize the behavior that is specific
to each class.
(for example, what it means when the pile is selected).
Since some piles share behavior that in other piles is overridden,
the parent class can provide a default behavior that can sometimes
be changed (for example, drawing).