我是否应该仅仅因为添加了一个变量而扩展了一个类?

时间:2018-09-01 17:28:52

标签: java oop object inheritance extends

想象一下,您有Person类,其中包含许多信息。现在,我考虑添加一个新变量,该变量不应从Person类访问,而我想扩展一个LivingBeing类(此示例仅用于此线程,因此请不要提出疑问。它的意义)。稍后,它可能不只是一个添加的变量,但是到目前为止,LivingBeing将具有一个Person不应该具有的变量。当用户决定这样做时,Person稍后会变成LivingBeing

要使这种继承有效,我将不得不做很多工作,但是最重要的是,我想知道您是否认为它是好的样式还是高效的。为这种简单的继承而更改大量代码是否值得?

另一种选择是,将此特定变量添加到Person中,直到“需要”以后才使用它。不过,这似乎是一种不好的样式,我认为继承是有原因的,我应该使用它。

编辑:重要的是,只有某些Person-对象成为LivingBeings,它们才能共存。因此,区分PersonLivingBeing对象会比较容易,而不是总是拥有Person

1 个答案:

答案 0 :(得分:3)

通常来说,对于这种问题并没有真正的答案。

如果您只是在构建自己的应用程序并且它专注于生物,那么我个人认为为非生物设置额外的类是一种浪费……除非有很好的商业案例。如果过度使用或使用不当,继承会很快变得混乱。

如果您要构建一个灵活的,可重用的库来处理各种未知情况,则您应在应用程序设计中更加严格,因为您可以做出更少的假设。

在后一种情况下,是的;开始将额外的变量添加到类(仅在某些情况下使用)是不好的设计。那会污染您的班级层次结构。

在解决这类设计问题时,您应该考虑很多继承的替代方法:

  1. 杂类-许多语言可以让您根据需要将特征混合到其他类中。严格来说,这不是Java内置的,但是在Java 8中,使用接口进行一些工作是可能的。如果将来需要的话,这将使您拥有额外的特定生活功能。

  2. 组成-在组成中,生物阶级将持有人阶级并对其行使职能。通常,这比继承干净。 https://en.wikipedia.org/wiki/Composition_over_inheritance

  3. 使属性层次结构仅代表类可以具有的其他功能。然后,您可以将其存储在person类内的某些map / etc中。这样,随着您添加更多属性,类中的更改将受到限制。