Stable Abstraction Principle (SAP)
The more stable a component is, the more abstract it should be
If a component is really stable, it's likely it's going to be serving more purposes for more groups of people, and for different problems.
In order to prevent a component from becoming too specific or rigid, we should primarily use abstract classes.
Abstract classes work well for defining the high-level policy and leaving room for various implementations of the low-level details.