java - 不允许多重继承时如何避免代码重复?

标签 java inheritance design-patterns composition

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

public class BaseClass{}

public class SubClass extends BaseClass{

//override some methods
}

还有另一个类 SimpleBaseClass,它派生自 BaseClass 并重写 BaseClass 的其他一些方法,因为与子类

 public class SimpleBaseClass extends BaseClass{

    //override some other methods
    }

在某些情况下,我想将SubClass 的功能和特性赋予SimpleBaseClass。最好做什么?在这种情况下有适用的模式吗?简单地说,我们可以创建一个派生自 SubClass 的新 SubSimpleBaseClass,复制 SimpleBaseClass 的代码,这样就具有这两个类的功能: 子类SimpleBaseClass

 public class SubSimpleBaseClass extends SubClass{

        //do what SimpleBaseClass does
        }

但通过这种方式,代码会在 SubSimpleBaseClass 中重复。避免这种情况的最佳方法是什么?也许组合?在这种情况下,装饰器模式是否是合适的解决方案?

最佳答案

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

interface Handler {
  void foo();
}

public class BaseClass {

  private final Handler handler; // constructor omitted

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

这允许您实现“多重继承”的轻型形式,您仍然可以通过多个类对 BaseClass 进行子类化,在这些类中您仍然可以实现 bar 的常见行为多个类(class)。这是common recommendation ,继承往往是over-used .

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

关于java - 不允许多重继承时如何避免代码重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24647758/

相关文章:

java - 更改 ImageButton Src 图像 OnClick

java - 同时调用时的 JVM 方法调用内部结构

c++ - 从模板化基类中取消隐藏模板化转换运算符

design-patterns - 复合模式和装饰模式的区别?

java - Jackson 将字符串列表反序列化为字符串

java - JerseyTest 在 Jersey 2.13 中使用 GrizzlyWebTestContainerFactory

inheritance - Kotlin,如何在扩展加实现时克服意外覆盖

c# - 派生类重新实现接口(interface)时如何调用基接口(interface)实现?

c# - Fluent APIs - 返回这个还是新的?

C# - 是否可以通过使用接口(interface)来实现单例模式?