如果不允许多重继承,如何避免代码重复?

时间:2014-07-09 07:31:57

标签: java inheritance design-patterns composition

我有一个类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的代码并以这种方式具有两个类的功能:SubClass和{{1 }}。

SimpleBaseClass

但是以这种方式代码在 public class SubSimpleBaseClass extends SubClass{ //do what SimpleBaseClass does } 中重复。避免它的最佳方法是什么?也许SubSimpleBaseClass?在这种情况下,Composition是否适合作为解决方案?

1 个答案:

答案 0 :(得分:5)

不要使用类层次结构来重用功能。而是使用委托模型,您可以将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

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