【问题标题】:Inheritance chain vs multiple extensions继承链与多重扩展
【发布时间】:2020-04-11 10:22:27
【问题描述】:

继承链是否应该避免?

我目前正在重构一个 java 项目,我遇到了许多类 (8),它们都具有共享功能。因此,使用 Extract Super Class 重构,我创建了一个具有该功能的超类并将其传递给所有子类。现在,其中 2 个类还具有第二个共享功能。我应该创建另一个从第一个超类继承的超类,然后由子类扩展还是简单地在 2 个子类上扩展多个类?

想法

尽管这两个选项都会起作用,但我觉得进行多个扩展是更可取的,因为它描述并阐明了类的职责。此外,我们将避免为了到达顶级超类而进行连续的 super() 调用。
另一方面,也许有一个继承链有点整理这个地方。

编辑:我明白我完全错误地陈述了我的问题。上面提到的 8 个类都遵循命令模式,因此每个类都有不同的目的和功能。我已经提取了一个超类以避免它们的构造函数中的代码重复。其中两个类也有更多的重复代码(重复功能,因为它们做同样的事情)。不幸的是,由于项目的性质,我没有编写原始代码以及时间紧迫的事实并没有让我完全重构整个项目。可以说,它现在无法修复。但我能做的就是拼凑起来,尝试删除重复的代码并稍微整理一下。

【问题讨论】:

  • 如果没有具体的例子,很难给出建议。与您给出的两个选项中的任何一个相比,组合很可能是一个更好的模式。认真思考你是否在处理“有”而不是“是”的关系。如果您可以举一个具体的例子,那么有人将能够明确回答哪种模式(组合、链接和多个扩展)最适合您的情况。
  • 编辑了我的问题,以便可能提供一些澄清。
  • 听起来这里没有“是”的关系,你可能应该尝试组合。但同样,如果没有看到您的代码,很难明确回答。

标签: java inheritance design-patterns refactoring


【解决方案1】:

当他们为is-a 关系建模时,应该使用超类。如果这8个类是同一个实体,可以使用一个共同的超类来避免重复。类层次结构会很快损害可维护性,并且应该尽可能简单。避免重复代码不是引入它们时的主要关注点。

正如@davidza5 已经指出的,composition over inheritance 的原则适用于此。最好将通用功能提取到模拟has-a 关系的类中,这样可以解耦功能并使以后更容易更改。

另一方面:如果重构在所有情况下都不起作用,这并不意味着它是错误的想法。如果它为大多数人带来了良好的结果,那么解决异常的怪癖是一个很好的权衡。

【讨论】:

  • 我相应地编辑了帖子以避免任何进一步的混淆。我觉得你的最后一段描述了我现在的情况。感谢您和@davidza5,还学会了始终喜欢组合而不是继承。
【解决方案2】:

在大多数情况下,这两种方法似乎都是一种不好的做法(更喜欢组合而不是继承)。如果您可以通过使用设计模式(外观、复合、适配器、装饰器......)来避免它。如果在您的情况下无法完成,那么我将应用封装和继承的原则。所以,在必要的时候链式继承。

【讨论】:

    猜你喜欢
    • 2020-03-16
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    相关资源
    最近更新 更多