Why would both a parent and child class implement the same interface? – Error is an illegal operation performed by the user which results in the abnormal working of the program. By now, you’ve probably seen a few errors, either when compiling or running your code like Why would both a parent and child class implement the same interface?. It can be frustrating, but they can also give you a lot of information about exactly how you can fix the problems in your code about java and inheritance. In this post covers the types of errors you’ll see when programming in Java, and how to fix them. Don’t pay any attention to the number of errors. Just read the first error message and work on fixing that error.
Problem :
I inherited some legacy Java (1.4) code and this design decision appears regularly. I can’t understand if there’s any purpose or reason to it.
public interface SoapFacade extends iConfigurable{ }
public class SoapFacadeBase implements SoapFacade{
...
}
public class SoapFacadeImpl extends SoapFacadeBase implements SoapFacade{
...
}
As I understand interfaces (and my experimentation has reinforced), there is no purpose to having both the parent and the child implement the same interface. In this scenario, everything from SoapFacade
is implemented in SoapFacadeBase
, but the method in iConfigurable
is implemented in SoapFacadeImpl
. However, that doesn’t create a need to have SoapFacadeImpl
implement SoapFacade
.
Is there something I don’t know about interfaces that would give this pattern some purpose or benefit? Are there underlying costs beyond lack of clarity that should drive refactoring it? Or should it simply be refactored for clarity/simplicity?
Solution :
As I understand interfaces (and my experimentation has reinforced), there is no purpose to having both the parent and the child implement the same interface.
No. Technically, it is completely redundant.
It does however document the fact that you intend SoapFacadeImpl
to be a SoapFacade
and it ensures that you get a compile error, if you (or someone else) decides to remove implements SoapFacade
from the base class.
You see this pattern everywhere in the standard Java Collections API. ArrayList
implements List
even though its base class (AbstractList
) already, does. Same holds for HashSet
/ AbstractSet
and the Set
interface.
If you use the interface also as a marker. Class.getInterfaces();
will only return directly instanced interfaces.
I actually find that design pointless. Implemented interfaces, as you stated, are just inherited, so there’s no need to copy and paste “implements SomeInterface” on the children classes.
It’s not clearer, smarter, or whatsoever…
It is nonsense, don’t do it.
Especially in a public API like java collections. It’s absolutely nonsense.