如何在没有多重继承的情况下避免代码重复(即在 java 中)?
How do I avoid code duplication without multiple inheritance (i.e. in java)?
(我是一名仍在学习最佳实践的新手开发人员,java - 任何 help/direction 将不胜感激,谢谢!)
假设我有以下情况:
ClassA
扩展抽象 ClassB
扩展抽象 ClassC
.
ClassD
扩展抽象 ClassE
扩展抽象 ClassF
它扩展了抽象 ClassC
.
[ClassC
是父级 class]
其中 ClassA
和 ClassD
具有一组相同的属性、getter 和 setter。
我想避免代码重复(属性、getter、setter)。我还想避免编写不同的方法 doSomething(ClassA class, ...)
和 doSomething(ClassD class, ...)
,它们除了参数类型外都是相同的。
如果这两个 class 直接继承自 ClassC
,我会让它们扩展一个具有所有 getter 和 setter 以及属性的 class,并将该类型传递给方法 doSomething(..)
。由于 ClassA
和 ClassD
不能扩展多个 classes,处理这种情况的最佳方法是什么?
我不确定我是否正确理解了你的问题,但我会试一试。创建多个接口,而不是多个抽象 classes。然后创建一个实现这两个接口的class。 Java 允许实现多个接口但不能从多个 class 扩展。
在我看来,扩展 ClassC
并包含 ClassA
和 ClassD.
[=18= 共有的方法的 ClassAD
可能会有用]
另一种选择是创建接口 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中的常用方法class
首先,让我说,当一个(他们自己承认)新手开发者关心这类问题时,这是非常好的。大多数开发人员都没有思考,而是编写了大量无意识的代码,因为这是他们知道行得通的路径,无需思考。 (并且必须维护所有这些代码似乎从来都不是什么大问题,因为......它在未来太远了!)
作文
大多数 Java 商店遵循的方法是避免继承,因为它太复杂了,而是使用组合来代替,这也导致不得不编写很多很多无意识的代码。通常情况下,这是由于对“支持组合而不是继承”的建议的误解,就好像它说的是“只使用组合,永远不要使用继承”。
我不确切地知道你在做什么,所以我不能建议你放弃你正在做的事情而改用合成。我只是假设你有使用继承的理由,所以,我不会在这里写更多关于组合的内容;如果您有兴趣了解有关组合的更多信息,可以轻松搜索术语“组合与继承”。
接口继承
从您描述的 class 结构来看,您似乎处于典型的情况下,可以从使用接口中获益良多:在 Java 中,一个 class不能扩展多个classes,但它可以实现多个接口。
如果两个接口都定义了一个方法,如reticulate( Spline s )
,而一个class实现了这两个接口,那么它可以提供一个reticulate()
的实现,并且满足两个接口。 (这样做的缺点是,如果您希望您的 class 为每个接口提供不同的 reticulate()
实现,您将陷入困境;无法完成。)
此外,Java 支持接口中的 default
方法,这意味着您需要提供的某些功能可以直接编码到接口中,以便实现 classes 从接口继承此功能,因此不必重新实现它。
你真的应该在这里讨论摘要 类。你打算如何测试 A、B、C、D、E 和 F?
这将包括很多由 C 实现的任何方法的重复测试用例(因为它也被所有其他 类)等使用。
如前所述,真正讨论组合而不是继承。 A 可能有一个 C,并通过方法。它也可能有一个Q,D也会有。
然后 D 和 A 都可以实现相同的接口(也可能由 Q 实现,尽管这可能会造成混淆)
请注意,我不喜欢抽象 类,而是更喜欢使用组合 and/or 策略。
(我是一名仍在学习最佳实践的新手开发人员,java - 任何 help/direction 将不胜感激,谢谢!)
假设我有以下情况:
ClassA
扩展抽象ClassB
扩展抽象ClassC
.ClassD
扩展抽象ClassE
扩展抽象ClassF
它扩展了抽象ClassC
.
[ClassC
是父级 class]
其中 ClassA
和 ClassD
具有一组相同的属性、getter 和 setter。
我想避免代码重复(属性、getter、setter)。我还想避免编写不同的方法 doSomething(ClassA class, ...)
和 doSomething(ClassD class, ...)
,它们除了参数类型外都是相同的。
如果这两个 class 直接继承自 ClassC
,我会让它们扩展一个具有所有 getter 和 setter 以及属性的 class,并将该类型传递给方法 doSomething(..)
。由于 ClassA
和 ClassD
不能扩展多个 classes,处理这种情况的最佳方法是什么?
我不确定我是否正确理解了你的问题,但我会试一试。创建多个接口,而不是多个抽象 classes。然后创建一个实现这两个接口的class。 Java 允许实现多个接口但不能从多个 class 扩展。
在我看来,扩展 ClassC
并包含 ClassA
和 ClassD.
[=18= 共有的方法的 ClassAD
可能会有用]
另一种选择是创建接口 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中的常用方法class
首先,让我说,当一个(他们自己承认)新手开发者关心这类问题时,这是非常好的。大多数开发人员都没有思考,而是编写了大量无意识的代码,因为这是他们知道行得通的路径,无需思考。 (并且必须维护所有这些代码似乎从来都不是什么大问题,因为......它在未来太远了!)
作文
大多数 Java 商店遵循的方法是避免继承,因为它太复杂了,而是使用组合来代替,这也导致不得不编写很多很多无意识的代码。通常情况下,这是由于对“支持组合而不是继承”的建议的误解,就好像它说的是“只使用组合,永远不要使用继承”。
我不确切地知道你在做什么,所以我不能建议你放弃你正在做的事情而改用合成。我只是假设你有使用继承的理由,所以,我不会在这里写更多关于组合的内容;如果您有兴趣了解有关组合的更多信息,可以轻松搜索术语“组合与继承”。
接口继承
从您描述的 class 结构来看,您似乎处于典型的情况下,可以从使用接口中获益良多:在 Java 中,一个 class不能扩展多个classes,但它可以实现多个接口。
如果两个接口都定义了一个方法,如reticulate( Spline s )
,而一个class实现了这两个接口,那么它可以提供一个reticulate()
的实现,并且满足两个接口。 (这样做的缺点是,如果您希望您的 class 为每个接口提供不同的 reticulate()
实现,您将陷入困境;无法完成。)
此外,Java 支持接口中的 default
方法,这意味着您需要提供的某些功能可以直接编码到接口中,以便实现 classes 从接口继承此功能,因此不必重新实现它。
你真的应该在这里讨论摘要 类。你打算如何测试 A、B、C、D、E 和 F?
这将包括很多由 C 实现的任何方法的重复测试用例(因为它也被所有其他 类)等使用。
如前所述,真正讨论组合而不是继承。 A 可能有一个 C,并通过方法。它也可能有一个Q,D也会有。
然后 D 和 A 都可以实现相同的接口(也可能由 Q 实现,尽管这可能会造成混淆)
请注意,我不喜欢抽象 类,而是更喜欢使用组合 and/or 策略。