Okay, now you made an interface with all the methods that change in each implementation.
As you program, you notice that some code blocks are shared by ALL implementations of the interface.
These code blocks should go in an abstract class, instead of being repeated in every implementation. That way, when something changes, you only fix the code in the abstract class instead of in every implementation.
It's only abstract because you want all the inheriting classes to have their own implementations.