Well, this is my thought on interfaces and abstract classes,
we want to have an abstract class when concrete classes will be sharing similar
implementation details, like each employee has a name, that field can be stored
in the abstract class, and also the property to access that information can be
in the abstract class. So when we have similar classes that will share code
use an abstract class, however if we have classes that are nothing to do with
one another but share some aspect that they do not share a common ancestor then
use an interface. Use sealed classes when the class should not have any
derived classes.