【问题标题】:How to avoid code duplication when multiple-inheritance is not allowed?不允许多重继承时如何避免代码重复?
【发布时间】:2014-07-09 07:31:57
【问题描述】:

我有一个类BaseClass 和一个类Subclass,它派生自Baseclass 并覆盖了它的一些方法。

public class BaseClass{}

public class SubClass extends BaseClass{

//override some methods
}

还有另一个类SimpleBaseClass 派生自BaseClass 并覆盖BaseClass 的一些其他方法,因为它与SubClass 相比提供不同的功能

 public class SimpleBaseClass extends BaseClass{

    //override some other methods
    }

在某些情况下,我想将SubClass 的功能和特性授予SimpleBaseClass。最好的做法是什么?在这种情况下是否有适用的模式?尽管可以创建一个新的SubSimpleBaseClass,它派生自SubClass,但复制SimpleBaseClass 的代码,这样就具有两个类的功能:SubClassSimpleBaseClass

 public class SubSimpleBaseClass extends SubClass{

        //do what SimpleBaseClass does
        }

但是通过这种方式代码在SubSimpleBaseClass 中重复。避免它的最佳方法是什么?也许Composition?在这种情况下,Decorator Pattern 会是一个合适的解决方案吗?

【问题讨论】:

  • 是的,使用依赖注入的组合可能会有所帮助?
  • 我认为你需要重新组织你的类层次结构。如果您需要在实施时做出非beautiful 架构/实施决定,那么您需要重新考虑您的架构。例如,做额外的继承步骤和额外的相互扩展的抽象类。
  • 不谈模式,如果SimpleBaseClassSubClass 之间有共同点,您可以为它们创建一个从BaseClass 派生的共同祖先,并让其他人从中派生。
  • 重构代码和重构模块的方法有很多。设计模式有助于找到具体要做什么。 composite 模式、decorator 模式、优先组合优于继承 思想等等,对于设计软件来说都是非常有价值的工具。 但是:重构的具体内容取决于您要实现的功能。或者更好:通过您要解决的问题。技术问题永远不应成为重构的动力。
  • @Davio:问题是 SimpleBaseClass 和 SubClass 没有共同实现的功能,它们覆盖了父级的不同方法。此外,最终目的是创建一个结合了它们的功能的派生类(无需重复代码)。

标签: java inheritance design-patterns composition


【解决方案1】:

不要使用类层次结构来重用功能。而是使用委托模型,将SubClass 和假设的SubSimpleBaseClass 所需的功能重构到另一个类中。一个简单的例子:

interface Handler {
  void foo();
}

public class BaseClass {

  private final Handler handler; // constructor omitted

  public void bar() {
    handler.foo();
  }
}

这允许您实现一种“多重继承”的轻量级形式,您仍然可以将BaseClass 子类化为多个类,您仍然可以在多个类中实现bar 的共同行为。这是一个common recommendation,继承通常是over-used

如果由于某种原因这是不可能的(您的示例不够详细,无法说明),请重构您的代码以使用实用程序方法。切勿复制和粘贴您的代码。这增加了维护成本。

【讨论】:

  • 我喜欢委托模型,我认为继承过多地用于分解代码。
  • 我终于按照您的回答所建议的那样实现了它。每个功能都移到其类中,所有类都实现相同的接口。基类拥有该接口的引用,并且可以通过 setter 交换类。事实上它以策略模式结束。
猜你喜欢
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 2011-04-14
  • 1970-01-01
相关资源
最近更新 更多