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

arj*_*soh 0 java inheritance design-patterns composition

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

public class BaseClass{}

public class SubClass extends BaseClass{

//override some methods
}
Run Code Online (Sandbox Code Playgroud)

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

 public class SimpleBaseClass extends BaseClass{

    //override some other methods
    }
Run Code Online (Sandbox Code Playgroud)

我想在某些情况下的功能和特性赋予SubClassSimpleBaseClass.最好的做法是什么?在这种情况下是否有适用的模式?简单地说,虽然可以创建一个新的SubSimpleBaseClass派生SubClass,但复制代码SimpleBaseClass并以这种方式具有两个类的功能:SubClassSimpleBaseClass.

 public class SubSimpleBaseClass extends SubClass{

        //do what SimpleBaseClass does
        }
Run Code Online (Sandbox Code Playgroud)

但是这样代码就会被重新编写SubSimpleBaseClass.避免它的最佳方法是什么?也许Composition?请问Decorator Pattern在这种情况下,适当的解决办法?

Raf*_*ter 5

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

interface Handler {
  void foo();
}

public class BaseClass {

  private final Handler handler; // constructor omitted

  public void bar() {
    handler.foo();
  }
}
Run Code Online (Sandbox Code Playgroud)

这允许您实现轻量级的"多重继承",您仍然可以BaseClass通过多个类进行子类化,您仍然可以bar在多个类中实现通用行为.这是一个常见的建议,继承往往被过度使用.

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