(我是一名新手开发人员,仍在学习最佳实践和 java - 任何帮助/指导将不胜感激,谢谢!)
假设我有以下情况:
ClassA
扩展了抽象ClassB
,而ClassB
又扩展了抽象ClassC
。ClassD
扩展了抽象ClassE
,而ClassE
又扩展了抽象ClassF
它扩展了抽象ClassC
。
[ClassC
是父类]
其中 ClassA
和 ClassD
具有一组相同的属性、getter 和 setter。
我想避免代码重复(属性、getter、setter)。我还想避免编写不同的方法 doSomething(ClassA class, ...)
和 doSomething(ClassD class, ...)
除了参数类型之外,它们在所有方面都是相同的.
如果这两个类直接从 ClassC
继承,我会让它们扩展一个具有所有 getter、setter 和属性的类,并将该类型传递到方法 doSomething(. .)
。由于 ClassA
和 ClassD
无法扩展多个类,那么处理这种情况的最佳方法是什么?
最佳答案
首先,让我说,(据他们自己承认)新手开发人员关心此类问题是非常好的。大多数开发人员会避免思考,只是编写大量无意识的代码,因为他们知道这是可行的路径,无需思考。 (并且必须维护所有这些代码似乎从来都不是一个大问题,因为......它距离 future 还很遥远!)
组成
大多数 Java 商店遵循的方法是避免继承,因为它太复杂,而是使用组合,这也导致必须编写大量无意识的代码。通常,这是由于对“优先使用组合而不是继承”的建议的误解,就好像它说“仅使用组合,从不使用继承”。
我不知道你正在做什么,所以我不能建议你放弃你正在做的事情并使用组合。我只是假设你有使用继承的理由,所以,我不会在这里写更多关于组合的内容;如果您有兴趣了解有关组合的更多信息,可以轻松地在 google 上搜索术语“组合与继承”。
接口(interface)继承
从您描述的类结构来看,您似乎处于一种典型的情况,可以从使用接口(interface)中受益匪浅:在Java中,一个类不能扩展多个类,但它可以实现多个接口(interface)。
如果两个接口(interface)都定义了像 reticulate( Spline s )
这样的方法,并且一个类实现了这两个接口(interface),那么它可以提供 reticulate()
的单个实现>,它将满足两个接口(interface)。 (这样做的缺点是,如果您希望您的类为每个接口(interface)提供不同的 reticulate()
实现,您就会陷入困境;这是无法完成的。)
此外,Java支持接口(interface)中的default
方法,这意味着您需要提供的某些功能可以直接编码到接口(interface)中,以便实现类从接口(interface)继承此功能因此不必重新实现它。
关于java - 如何在没有多重继承的情况下避免代码重复(即在 java 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39540468/