阅读Interface vs Base class之后,我明白在存在“is-a”关系的情况下应该使用继承,并且应该在“can-do”类型的地方使用接口。
如果这意味着,基类只能有业务对象,接口只有合同吗?
例如 Dog 类将具有基类 Animal ,其属性包括Eye,Nose,Leg等,界面 IAnimal 将具有“运行” “,”跳“等。
设计是否适用于所有情景?
答案 0 :(得分:0)
你所链接的那个问题的答案实际上就说明了一切。特别是接受的答案和第一个评论。您使用接口来声明合同和共享实现的基类。
我认为为(几乎)所有内容定义接口是一种常见做法。接口还可以包含getter和setter,因此可以定义其子类型属性。如果实现该接口的两个或多个类共享某些实现,则可以将其移动到基类。然后该基类也将实现接口。
答案 1 :(得分:0)
您的理解是正确的,但我认为它更多地依赖于良好实践,而不是实际的语言规则。请考虑以下事项:
因此,从技术上讲,接口必须仅定义合约(默认方法可以在Java 8接口中实现回退行为),而抽象类必须定义行为(因为没有实现的纯抽象类可以存在),你所描述的方法在现实世界中是合理和常见的。
答案 2 :(得分:0)
取决于......
这是一个很好的起点,但说它适用于所有场景是不对的。系统不断变化,作为重构的一部分(http://refactoring.com/catalog/),有时接口成为子类,反之亦然。接口适用于Mix-ins,你提到它是“可以做”的行为和继承,其中一组类共享某些属性,可能还有一些行为,可以重用并避免代码重复(这实质上就是IS-A的关系) )。您可以在Joshua Bloch的Effective Java中阅读更多相关信息(有关接口和继承的项目)。
如果我们以你的例子为例,“Run”和“Jump”方法可以在Animal基类中定义,也可以在你提到的界面中进行,实际上它们实际上也可以进入多个接口。因此,您可以从构建继承层次结构开始,然后在系统发展时将它们重构为接口。