[英]How do I avoid code duplication without multiple inheritance (i.e. in java)?
(我是一名新手开发人员,仍在学习最佳实践和 Java - 任何帮助/指导将不胜感激,谢谢!)
假设我有以下情况:
ClassA
扩展了抽象ClassB
,后者扩展了抽象ClassC
。ClassD
扩展了抽象ClassE
,它扩展了抽象ClassF
,后者扩展了抽象ClassC
。 [ ClassC
是父类]
其中ClassA
和ClassD
具有一组相同的属性、getter 和 setter。
我想避免代码重复(属性、getter、setter)。 我还想避免编写不同的方法doSomething(ClassA class, ...)
和doSomething(ClassD class, ...)
除了参数类型外,它们在所有方面都相同。
如果这两个类直接从ClassC
继承,我会让它们扩展一个包含所有 getter、setter 和属性的类,并将该类型传递给方法doSomething(..)
。 由于ClassA
和ClassD
不能扩展多个类,那么处理这种情况的最佳方法是什么?
首先,让我说,当(他们自己承认)新手开发人员关注此类问题时,这是非常好的。 大多数开发人员避免思考,只是编写大量无意识的代码,因为这是他们知道可行的路径,不需要思考。 (并且必须维护所有这些代码似乎从来都不是什么大问题,因为......它在未来很远!)
大多数Java商店遵循的方法是避免继承,因为它太复杂了,而使用组合来代替,这也会导致必须编写大量无意识的代码。 通常情况下,这是由于对“支持组合而不是继承”的建议的误解,就好像它说“只使用组合,从不使用继承”一样。
我不确切地知道你在做什么,所以我不能建议你放弃你正在做的事情而改用合成。 我只是假设您有使用继承的原因,因此,我不会在这里写更多关于组合的内容; 如果您有兴趣了解有关组合的更多信息,可以很容易地在 Google 上搜索“组合与继承”一词。
从您描述的类结构来看,您似乎处于可以从使用接口中大大受益的典型情况:在 Java 中,一个类不能扩展多个类,但它可以实现多个接口。
如果两个接口都定义了一个像reticulate( Spline s )
这样的方法,并且一个类实现了这两个接口,那么它可以提供reticulate()
的单个实现,并且它将满足两个接口。 (这样做的缺点是,如果您希望您的类为每个接口提供不同的reticulate()
实现,您就会陷入困境;这是无法完成的。)
此外,Java 支持接口中的default
方法,这意味着您需要提供的某些功能可以直接编码到接口中,以便实现类从接口继承此功能,因此不必重新实现它.
我不确定我是否正确理解了您的问题,但我会尝试一下。 创建多个接口而不是多个抽象类。 然后创建一个实现这两个接口的类。 Java 允许实现多个接口,但不能从多个类扩展。
在我看来,拥有一个ClassAD
可能很有用,它扩展ClassC
并包含ClassA
和ClassD.
通用方法ClassD.
另一种选择是创建接口InterfaceAD
并让ClassA
和ClassD
实现它。 使用接口作为函数的参数,比如doSomething(InterfaceAD i)
你可以喜欢
class M
class A extends B
inherit B's stuff
class D extends E
inherit E's stuff
A b = new A();
D d = new D();
// or use anonymous classes
M has access to everything in A and D,
therefore M has access to A and D inheritable assets.
现在在 C 类中添加你的常用方法
你真的应该在这里讨论抽象类。 您将如何测试A、B 和 C、D、E 和 F?
这将包括由 C 实现的任何方法的大量重复测试用例(因为它也被所有其他类使用)等。
如前所述,真正讨论组合而不是继承。 A 可能有一个 C,并通过方法。 它也可能有一个 Q,D 也可能有一个 Q。
然后 D 和 A 都可以实现相同的接口(可能也由 Q 实现,尽管这可能会让人感到困惑)
请注意,我不喜欢抽象类,而是更喜欢使用组合和/或策略。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.