为什么父类和子类都实现相同的接口?

时间:2011-04-14 19:12:16

标签: java inheritance interface

我继承了一些遗留Java(1.4)代码,这个设计决定定期出现。我无法理解是否有任何目的或理由。

public interface SoapFacade extends iConfigurable{ }

public class SoapFacadeBase implements SoapFacade{
...
}

public class SoapFacadeImpl extends SoapFacadeBase implements SoapFacade{
...
}

据我了解接口(以及我的实验已经加强),没有任何目的让父和子实现相同的接口。在此方案中,SoapFacade中的所有内容都在SoapFacadeBase中实现,但iConfigurable中的方法在SoapFacadeImpl中实现。但是,这并不需要SoapFacadeImpl实施SoapFacade

是否有一些我不了解的接口会给这种模式带来某些目的或好处?除了缺乏清晰度之外,还有潜在的成本会导致重构吗?或者是否应该为了清晰/简单而进行重构?

4 个答案:

答案 0 :(得分:39)

  

据我了解接口(我的实验已经加强),没有任何目的让父母和孩子都实现相同的界面。

没有。从技术上讲,它完全是多余的。

然而, 确实记录了您希望SoapFacadeImpl成为SoapFacade的事实,如果您(或其他人)决定,它会确保您收到编译错误从基类中删除implements SoapFacade

您可以在标准Java Collections API中的任何位置看到此模式。 ArrayList实现了List,即使它的基类(AbstractList)已经存在。同样适用于HashSet / AbstractSetSet界面。

答案 1 :(得分:11)

如果您还将界面用作标记。 Class.getInterfaces();只会直接返回实例化接口。

答案 2 :(得分:0)

我实际上发现那个设计毫无意义。如上所述,已实现的接口只是继承的,因此不需要在子类上复制和粘贴“implements SomeInterface”。 它不是更清晰,更聪明,或者无论如何......

答案 3 :(得分:-3)

这是无稽之谈,不要这样做。

特别是在像java集合这样的公共API中。这绝对是胡说八道。