接口和基类可以组合在一起吗?

时间:2014-07-08 09:36:56

标签: oop inheritance interface base-class

阅读Interface vs Base class之后,我明白在存在“is-a”关系的情况下应该使用继承,并且应该在“can-do”类型的地方使用接口。

如果这意味着,基类只能有业务对象,接口只有合同吗?

例如 Dog 类将具有基类 Animal ,其属性包括Eye,Nose,Leg等,界面 IAnimal 将具有“运行” “,”跳“等。

设计是否适用于所有情景?

3 个答案:

答案 0 :(得分:0)

你所链接的那个问题的答案实际上就说明了一切。特别是接受的答案和第一个评论。您使用接口来声明合同和共享实现的基类。

我认为为(几乎)所有内容定义接口是一种常见做法。接口还可以包含getter和setter,因此可以定义其子类型属性。如果实现该接口的两个或多个类共享某些实现,则可以将其移动到基类。然后该基类也将实现接口。

答案 1 :(得分:0)

您的理解是正确的,但我认为它更多地依赖于良好实践,而不是实际的语言规则。请考虑以下事项:

  1. 在支持多继承(C ++)的语言中,接口只是所有方法都是虚拟和抽象的类。请参阅this question
  2. 不允许多重继承的语言(Java),最重要的区别是一个类可以有不超过1个超类,但可以实现任意数量的接口。声明变量也存在差异(变量在Java接口中是隐式静态和最终的),但从100%抽象类开始考虑接口仍然不是一个很大的飞跃。
  3. Java 8引入了默认方法(参见this question),它可以模糊这两者之间的明显区别。
  4. 因此,从技术上讲,接口必须定义合约(默认方法可以在Java 8接口中实现回退行为),而抽象类必须定义行为(因为没有实现的纯抽象类可以存在),你所描述的方法在现实世界中是合理和常见的。

答案 2 :(得分:0)

取决于......

这是一个很好的起点,但说它适用于所有场景是不对的。系统不断变化,作为重构的一部分(http://refactoring.com/catalog/),有时接口成为子类,反之亦然。接口适用于Mix-ins,你提到它是“可以做”的行为和继承,其中一组类共享某些属性,可能还有一些行为,可以重用并避免代码重复(这实质上就是IS-A的关系) )。您可以在Joshua Bloch的Effective Java中阅读更多相关信息(有关接口和继承的项目)。

如果我们以你的例子为例,“Run”和“Jump”方法可以在Animal基类中定义,也可以在你提到的界面中进行,实际上它们实际上也可以进入多个接口。因此,您可以从构建继承层次结构开始,然后在系统发展时将它们重构为接口。