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

Rig*_*ggy 29 java inheritance interface

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

public interface SoapFacade extends iConfigurable{ }

public class SoapFacadeBase implements SoapFacade{
...
}

public class SoapFacadeImpl extends SoapFacadeBase implements SoapFacade{
...
}
Run Code Online (Sandbox Code Playgroud)

据我了解接口(以及我的实验已经强化),没有任何目的让父和子实现相同的接口.在这种情况下,所有内容都在其中SoapFacade实现SoapFacadeBase,但方法iConfigurable实现于SoapFacadeImpl.但是,这并不需要SoapFacadeImpl实现SoapFacade.

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

aio*_*obe 40

据我了解接口(以及我的实验已经强化),没有任何目的让父和子实现相同的接口.

不.从技术上讲,它完全是多余的.

但是,如果您(或其他人)决定从基类中删除,它确实会记录您打算SoapFacadeImpl成为a SoapFacade并确保您收到编译错误的事实implements SoapFacade.

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

  • 它有一些副作用。如果您想用SomethingElse 替换SoapFacade(不是重命名SoapFacade,而是用完全不同的界面替换),则必须在任何地方替换它,而且某些IDE(如Eclipse)的“重构”功能也无济于事。此外,如果您将代码传递给其他人,他们可能会花几分钟找出为什么他们会在子类上出现编译错误(例如:wtf...谁写的这个) (2认同)

How*_*ard 11

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