在设计类图时可以使用抽象类(实现接口)吗?我的指导要点是,如果有人直接使用界面怎么办?他建议设计应该坚持使用接口和类?背后有什么原因吗?
答案 0 :(得分:0)
您当然可以做到。
一个突出的例子是AbstractList。
此抽象类提供列表接口的“基本”实现。这样就可以编写更具体的实现,例如LinkedList和ArrayList,而无需复制大量的通用代码。
请注意:在上述情况下,该抽象类的“核心”行为将在以后成为“列表”实现。但是,也有可能使抽象类“额外”实现某些接口,仅仅是因为这样做是有意义的。
您没有具体询问,但是值得一提的是Java8向接口引入了默认方法,而Java9在接口内添加了私有和静态方法。
这意味着:我给出的示例可以如今编写,而无需抽象基类。该抽象基类没有任何 fields (又称:没有内部状态)。它通过调用List接口的其他方法来完成所有工作。
因此:使用默认方法,您可以创建具有实现行为的复杂接口。通过允许使用静态/私有方法,您甚至可以解决“干净代码”的各个方面(例如将公共代码提取到私有帮助器方法中以避免重复)。但是如上所述:这仅适用于不需要字段存储内部状态的情况。
但是回到您最初的问题:答案是肯定的。并且请理解,仅由于默认方法,抽象类变得无关紧要。使用抽象基类而不是仅依赖“增强的接口”可能还有其他充分的理由。