【问题标题】:Should I extend a class just because one variable is added?我应该仅仅因为添加了一个变量就扩展一个类吗?
【发布时间】:2018-09-01 17:28:51
【问题描述】:

假设你有一个类Person,它包含很多信息。现在我考虑添加一个新变量,它不应该从Person 类访问,而是我想扩展一个LivingBeing 类(这个例子只是针对这个线程,所以请不要质疑它的意义)。稍后,它可能不仅仅是一个添加的变量,但现在,LivingBeing 将拥有一个 Person 不应该拥有的变量。当用户决定时,Person 稍后将变为 LivingBeing

我必须做很多修改才能使这种继承工作,但最重要的是我想知道你是否会认为它是好的风格还是高效的。是否值得为这种简单的继承更改大量代码?

另一种方法是将这个特定变量添加到Person,并且在“稍后”需要它之前不要使用它。不过,这似乎是一种糟糕的风格,继承的存在是有原因的,我想我应该使用它。

编辑:可能重要的是只有一些Person-Objects 变成LivingBeings,它们共存。所以区分PersonLivingBeing对象会更容易,而不是总是有Person

【问题讨论】:

  • 如果Person would later on become LivingBeing你应该使用组合而不是继承。
  • 不错!没有听说过这个,但我不确定这是否真的解决了我的问题。我可能会添加其他信息。
  • “优先组合优于继承”是 OOP 的基本范式之一。
  • 但是可读性不也是编程整体的通用范式吗?我不会为了这样一个简单的问题而牺牲很多可读性吗?
  • @GhostCat 不,它不是 OOP 中的基本范式。如果有其他的话,更准确地说,继承是 OOP 的基本范式,但在设计中应谨慎使用。

标签: java oop object inheritance extends


【解决方案1】:

一般来说,这类问题并没有真正具体的答案。

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

如果您正在构建一个灵活、可重用的库来处理广泛的未知情况,那么您应该在应用程序设计中更加严格,因为您可以做出更少的假设。

在后一种情况下,是的;开始向您的类添加仅在某些情况下使用的额外变量将是糟糕的设计。那会污染你的类层次结构。

在处理这些类型的设计问题时,您应该考虑继承的许多替代方案:

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

  2. 组合 - 在组合中,生物类将持有人类并将功能推迟到它。这通常比继承更干净。 https://en.wikipedia.org/wiki/Composition_over_inheritance

  3. 创建一个属性层次结构,只代表一个类可以拥有的额外特性。然后你可以将它存储在 person 类中的一些 map/etc 中。这样,当您添加更多属性时,类中的更改将受到限制。

【讨论】:

  • 感谢您的回答!两个问题,livingBeing 持有人是否意味着,即使它还不是 livingBeing,我也会一直指 livingBeing?其次,“属性层次结构”是什么意思?某种 JavaDoc?
  • @ProgFroz 不,你可以拥有一个人或一个生物,它拥有一个人并将功能交给它。这是一个常见的模式,只是谷歌一点:)。属性层次结构是任意的,但例如创建一个属性基类,以及执行这些额外选项的实现(如生物)。然后你把这些属性放在一个 map/etc 中,这样你就可以在不影响 Person 层次结构的情况下添加许多属性。
猜你喜欢
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多