如何在没有多重继承的情况下避免代码重复(即在 java 中)?

How do I avoid code duplication without multiple inheritance (i.e. in java)?

(我是一名仍在学习最佳实践的新手开发人员,java - 任何 help/direction 将不胜感激,谢谢!)

假设我有以下情况:

[ClassC 是父级 class]

其中 ClassAClassD 具有一组相同的属性、getter 和 setter。

我想避免代码重复(属性、getter、setter)。我还想避免编写不同的方法 doSomething(ClassA class, ...)doSomething(ClassD class, ...),它们除了参数类型外都是相同的。

如果这两个 class 直接继承自 ClassC,我会让它们扩展一个具有所有 getter 和 setter 以及属性的 class,并将该类型传递给方法 doSomething(..)。由于 ClassAClassD 不能扩展多个 classes,处理这种情况的最佳方法是什么?

我不确定我是否正确理解了你的问题,但我会试一试。创建多个接口,而不是多个抽象 classes。然后创建一个实现这两个接口的class。 Java 允许实现多个接口但不能从多个 class 扩展。

在我看来,扩展 ClassC 并包含 ClassAClassD.[=18= 共有的方法的 ClassAD 可能会有用]

另一种选择是创建接口 InterfaceAD 并让 ClassAClassD 实现它。使用接口作为函数的参数,如 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 策略。