繁体   English   中英

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

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

(我是一名新手开发人员,仍在学习最佳实践和 Java - 任何帮助/指导将不胜感激,谢谢!)

假设我有以下情况:

  • ClassA扩展了抽象ClassB ,后者扩展了抽象ClassC
  • ClassD扩展了抽象ClassE ,它扩展了抽象ClassF ,后者扩展了抽象ClassC

[ ClassC是父类]

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

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

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

首先,让我说,当(他们自己承认)新手开发人员关注此类问题时,这是非常好的。 大多数开发人员避免思考,只是编写大量无意识的代码,因为这是他们知道可行的路径,不需要思考。 (并且必须维护所有这些代码似乎从来都不是什么大问题,因为......它在未来很远!)

组成

大多数Java商店遵循的方法是避免继承,因为它太复杂了,而使用组合来代替,这也会导致必须编写大量无意识的代码。 通常情况下,这是由于对“支持组合而不是继承”的建议的误解,就好像它说“只使用组合,从不使用继承”一样。

我不确切地知道你在做什么,所以我不能建议你放弃你正在做的事情而改用合成。 我只是假设您有使用继承的原因,因此,我不会在这里写更多关于组合的内容; 如果您有兴趣了解有关组合的更多信息,可以很容易地在 Google 上搜索“组合与继承”一词。

接口继承

从您描述的类结构来看,您似乎处于可以从使用接口中大大受益的典型情况:在 Java 中,一个类不能扩展多个类,但它可以实现多个接口。

如果两个接口都定义了一个像reticulate( Spline s )这样的方法,并且一个类实现了这两个接口,那么它可以提供reticulate()的单个实现,并且它将满足两个接口。 (这样做的缺点是,如果您希望您的类为每个接口提供不同的reticulate()实现,您就会陷入困境;这是无法完成的。)

此外,Java 支持接口中的default方法,这意味着您需要提供的某些功能可以直接编码到接口中,以便实现类从接口继承此功能,因此不必重新实现它.

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

在我看来,拥有一个ClassAD可能很有用,它扩展ClassC并包含ClassAClassD.通用方法ClassD.

另一种选择是创建接口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 类中添加你的常用方法

你真的应该在这里讨论抽象类。 您将如何测试A、B 和 C、D、E 和 F?
这将包括由 C 实现的任何方法的大量重复测试用例(因为它也被所有其他类使用)等。

如前所述,真正讨论组合而不是继承。 A 可能有一个 C,并通过方法。 它也可能有一个 Q,D 也可能有一个 Q。
然后 D 和 A 都可以实现相同的接口(可能也由 Q 实现,尽管这可能会让人感到困惑)

请注意,我不喜欢抽象类,而是更喜欢使用组合和/或策略。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM