[refactoring] merge Interface with Impl classes

I know there are people who live and die by the interface segregation principle but I'm of the opinion that an abstract class works as good as an interface to define a contract, if not better. And it comes with the advantage that you don't need the extra redirection level nor the duplication.
I only use interfaces in two cases.
I only use interfaces in two cases.
- There are at least 2 immediate implementations in the abstraction tree and there is no instance behavior that would render an abstract class more suitable.
- You want to restrict the API and define the interface so that you can pass object with as much methods as needed.