我应该仅仅因为添加了一个变量就扩展 class 吗?
Should I extend a class just because one variable is added?
假设您有 Class Person
,其中包含大量信息。现在我考虑添加一个新变量,它不应该从 Person
Class 访问,而是我想扩展一个 LivingBeing
Class (这个例子只是为了这个线程,所以请不要质疑它的意义)。以后可能不止增加一个变量,但现在 LivingBeing
会有一个 Person
不应该有的变量。当用户决定时,Person
稍后会变成 LivingBeing
。
我将不得不进行大量修改才能使这种继承发挥作用,但最重要的是,我想知道您认为它是好的风格还是高效的。是否值得为这个简单的继承更改大量代码?
另一种方法是,将这个特定变量添加到 Person
,并且在需要 "later on" 之前不要使用它。虽然这似乎是一种糟糕的风格,但我认为继承存在是有原因的,我应该使用它。
编辑:可能重要的是只有一些 Person
-对象变成 LivingBeings
,它们共存。因此,区分 Person
和 LivingBeing
对象会更容易,而不是总是 Person
.
一般来说,这类问题没有真正具体的答案。
如果您只是构建自己的应用程序并且它专注于生物,我个人认为为非生物提供额外的 classes 是一种浪费...除非有这样做的良好商业案例。当过度使用或使用不当时,继承会很快变得混乱。
如果您正在构建一个灵活、可重复使用的库来处理范围广泛的未知情况,那么您应该在应用程序设计中更加严格,因为您可以做出更少的假设。
在后一种情况下,是的;开始向您的 classes 添加仅在某些情况下使用的额外变量将是糟糕的设计。那会污染你的 class 层次结构。
在处理这些类型的设计问题时,您应该考虑继承的许多替代方案:
Mixins - 许多语言允许您根据需要将特征混合到其他 classes 中。这并非严格内置于 Java 中,但在 Java 8 中可以使用接口进行一些工作。如果将来需要,那将允许您拥有额外的生物特定功能。
组合 - 在组合中,生物 class 会抓住人 class 并将功能交给它。这通常比继承更干净。 https://en.wikipedia.org/wiki/Composition_over_inheritance
创建一个仅表示 class 可以拥有的额外功能的属性层次结构。然后你可以将它存储在人 class 内部的某个 map/etc 中。这样,当您添加更多属性时,class 中的更改将受到限制。
假设您有 Class Person
,其中包含大量信息。现在我考虑添加一个新变量,它不应该从 Person
Class 访问,而是我想扩展一个 LivingBeing
Class (这个例子只是为了这个线程,所以请不要质疑它的意义)。以后可能不止增加一个变量,但现在 LivingBeing
会有一个 Person
不应该有的变量。当用户决定时,Person
稍后会变成 LivingBeing
。
我将不得不进行大量修改才能使这种继承发挥作用,但最重要的是,我想知道您认为它是好的风格还是高效的。是否值得为这个简单的继承更改大量代码?
另一种方法是,将这个特定变量添加到 Person
,并且在需要 "later on" 之前不要使用它。虽然这似乎是一种糟糕的风格,但我认为继承存在是有原因的,我应该使用它。
编辑:可能重要的是只有一些 Person
-对象变成 LivingBeings
,它们共存。因此,区分 Person
和 LivingBeing
对象会更容易,而不是总是 Person
.
一般来说,这类问题没有真正具体的答案。
如果您只是构建自己的应用程序并且它专注于生物,我个人认为为非生物提供额外的 classes 是一种浪费...除非有这样做的良好商业案例。当过度使用或使用不当时,继承会很快变得混乱。
如果您正在构建一个灵活、可重复使用的库来处理范围广泛的未知情况,那么您应该在应用程序设计中更加严格,因为您可以做出更少的假设。
在后一种情况下,是的;开始向您的 classes 添加仅在某些情况下使用的额外变量将是糟糕的设计。那会污染你的 class 层次结构。
在处理这些类型的设计问题时,您应该考虑继承的许多替代方案:
Mixins - 许多语言允许您根据需要将特征混合到其他 classes 中。这并非严格内置于 Java 中,但在 Java 8 中可以使用接口进行一些工作。如果将来需要,那将允许您拥有额外的生物特定功能。
组合 - 在组合中,生物 class 会抓住人 class 并将功能交给它。这通常比继承更干净。 https://en.wikipedia.org/wiki/Composition_over_inheritance
创建一个仅表示 class 可以拥有的额外功能的属性层次结构。然后你可以将它存储在人 class 内部的某个 map/etc 中。这样,当您添加更多属性时,class 中的更改将受到限制。