Abstract vs Interface
We all know that we should program to the interface not the implementation. But what is an interface? and how do we know what kind of interface to use?
You might think the answer is simple, and many times it is, but there is a case where the line becomes hard to distinguish.
That case is known as Abstract vs Interface.
The question is should I use an abstract base class or implement an interface? After all, they are both programing to the interface not the implementation.
In the example below, each "Agent" has one communication device, but it may be a cellphone, computer or pager. To contact an agent, we can just pass the message we want to send to their communication device.
But which is the right design to use? The one with an abstract base class or the one with an interface?
There is no one rule about which to use, but here are some things to think about when you decide which to use in your design.
Allows you to have a different base class, good for Java.
Lets objects that have a different main purpose fill the role needed.
Base class allows default actions, only override the methods needed.
Build well defined class structures, this can help simply overall design.
Some good ways to tell which you should be using are:
Do you need default actions? if so you probably need to have an abstract base class, because these are not supported by interfaces. Another way of looking at it is are all your methods abstract? If so then you don't need an abstract base class and can just go with an interface.