关于对象设计的澄清

时间:2015-10-18 16:34:37

标签: java oop

我怀疑何时使用接口以及何时在OO设计中使用继承。假设我有一个人类,它继承自哺乳动物类。哺乳动物类将具有实例变量,如眼睛,鼻子,耳朵和四肢。我的问题是eat方法是应该进入Mammal类还是应该在Interface中。我认为吃,睡,呼吸方法应该进入界面。如果我的OO设计是正确的,请告诉我,如果我的理解是错误的,请告诉我。

2 个答案:

答案 0 :(得分:3)

  

我的问题是eat方法是应该进入Mammal类还是应该在接口中。

为什么它不能同时存在于基类的接口中?

(请注意,我不是100%的Java机制专家,并且不确定如何在代码中实现它。这是关于面向对象设计的语言无关的答案。 )

接口和基类不是可以互换的东西,因为你的问题的措辞似乎几乎意味着。它们有两个非常不同的用途。

接口是一种功能契约。它是一组可以由对象实现的操作。另一方面,基类是该对象的具体类型。用模糊的伪比喻来想一想......

  

界面会告诉您可以执行的操作。   基本类型告诉你什么是什么。

考虑你的例子......哺乳动物和人类。现在,显然,哺乳动物必须是抽象类型。你不能拥有通用的哺乳动物"在世界上敲门,它必须是某种物种。并且考虑到所有哺乳动物都以某种方式进食。

所有哺乳动物的吃法是否完全相同?如果是这样,那么您可以在抽象基类上创建eat()的单个实现,所有继承类型都会使用它。

大多数哺乳动物吃的方式完全相同,但有一些例外吗?如果是这样,那么你仍然可以创建eat()的基本实现,但允许继承类型覆盖它如果他们选择这样做,他们自己的实现。

大部分或全部哺乳动物是否以完全不同的方式进食,但所有以某种方式进食?如果是这样,那么您可能想要创建一个抽象的{{ 1}}基类中的方法签名,并要求继承类型实现它。

好的,那么界面在哪里?

嗯,哺乳动物不是唯一吃的东西。鸟吃。蜥蜴吃。植物吃。机器人吃。火吃。等

吃很多东西。不只是哺乳动物及其后代类型。甚至不只是他们的祖先类型。甚至不仅仅是与哺乳动物有任何关系的类型。 (例如,火。)所以"吃"的概念与哺乳动物遗传中的类型层次结构正交。

为了将这些通过继承模型相关的实现(或至少不是保证)组合在一起,您需要定义一个接口

假设您有一个只想提供对象的操作。虽然系统的其他部分可能会关心该物体是哺乳动物,也不是任何种类的动物,或者甚至只是一种生物......这种操作不会。它只关心物体可以以某种方式进食。机器人或火灾或其他非生物可以满足这一要求。此操作将声明它需要eat(),而不是Eater

因此,在基本类型(生物,动物,哺乳动物等)的抽象层次结构中,其中一种类型(可能是本例中的顶级类型)声明它实现了Mammal接口。这将强制所有继承类型也必须实现该接口。

如果有后代类型继承的抽象高级实现,则接口满足。如果没有,则后代类型需要提供Eater的实现来满足接口。

但重点是,完全在这个特定的继承图之外的其他东西也可以实现该接口,也可以吃。

答案 1 :(得分:0)

你是对的。您可以创建一个包含这些方法的Animal接口。在子类(实现Animal)中,应该实现这些方法。因为例如MammalReptile具有不同的步行技术