java - 继承链与多重扩展
问题描述
继承链是应该避免的吗?
我目前正在重构一个 java 项目,我遇到了许多类 (8),它们都具有共享功能。因此,使用 Extract Super Class 重构,我创建了一个具有该功能的超类并将其传递给所有子类。现在,其中 2 个类还具有第二个共享功能。我应该创建另一个从第一个超类继承的超类,然后由子类扩展还是简单地在 2 个子类上扩展多个类?
想法
尽管这两种选择都可行,但我觉得进行多个扩展是更可取的,因为它描述并阐明了类的职责。此外,我们将避免为了到达顶级超类而进行连续的 super() 调用。
另一方面,也许有一个继承链有点整理这个地方。
编辑:我明白我说我的问题完全错误。上面提到的 8 个类都遵循命令模式,因此每个类都有不同的目的和功能。我已经提取了一个超类以避免它们的构造函数中的代码重复。其中两个类也有更多的重复代码(不是重复的功能,因为它们做同样的事情)。不幸的是,由于项目的性质,我没有编写原始代码以及时间紧迫的事实并没有让我完全重构整个项目。可以说,它现在无法修复。但我能做的就是拼凑起来尝试删除重复的代码并整理一下这个地方。
解决方案
对关系建模时应该使用超类is-a
。如果这8个类是同一个实体,可以使用一个共同的超类来避免重复。类层次结构会很快损害可维护性,并且应该尽可能简单。避免重复代码不是引入它们时的主要关注点。
正如@davidza5 已经指出的那样,组合优于继承的原则适用于此。最好将通用功能提取到对has-a
关系建模的类中,这样可以解耦功能并使以后更容易更改。
另一方面:如果重构在所有情况下都不起作用,这并不意味着它是错误的想法。如果它为大多数人带来了良好的结果,那么解决异常的怪癖是一个很好的权衡。
推荐阅读
- javascript - 有没有办法在崩溃后恢复 js 回调?
- python - 为什么这个函数不能返回正确的结果?
- java - componentResized 侦听器不适用于 setIcon()
- javascript - 通过 dialogflow iframe 代码在 android 中“此应用程序在没有 javascript 的情况下无法运行”
- python - 在 Python 中操作嵌套字典中的列表值
- scala - 使用无形 HList 检查带有选项字段的案例类,以确保它们都为无
- facebook - Facebook graph api 无法在评论列表中获取一些属性,如 admin_notes、labels 或 custom_labels
- ios - 未在 UITextField 自定义子类中调用的委托方法
- swift - Swift:测试非可选值是否为 nil / 未设置
- css - 创建/表格间距