java - 如何继承/使用多个类的方法

标签 java inheritance design-patterns refactoring

当前我有一个基类,其中包含项目的init和teardown方法,以及一些大量的常用方法,并且这些方法被其子类继承/使用。

由于基础类变得越来越大,所以我尝试将这些常用方法移至新创建的类中,以提高项目的模块化程度。原始基类继承了那些新创建的类的方法。 (多重继承?)

有重构这个的建议吗?还需要尽量减少对子类的影响..最少的代码更改将是完美的..

Base class 
-method1()
-method2()
-method3()
-method4()
-method5()
-method6()--------
    |            |
    |            |
subclasse1     subclass2 

最佳答案

首先,java中没有类的多重继承(只有接口(interface)的多重继承)。

但是,在 java 8 中,您可以编写接口(interface)方法的默认实现(请参阅 "Default Methods" on docs.oracle.com )。但有一些限制:

  • 您仍然无法在界面中声明字段
  • 如果同一方法在不同接口(interface)中有 2 个默认实现,您仍然需要重写它们。

您最好使用 adapter pattern ,即将您的代码折射为如下所示:

public class BaseClass {
    private final Adaptee1 adaptee1;
    private final Adaptee2 adaptee2;
    // ...

    public BaseClass(Adaptee1 adaptee1, Adaptee2 adaptee2 /* , ...*/) {
        this.adaptee1 = adaptee1;
        this.adaptee2 = adaptee2;
        //...
    }

    public BaseClass() {
        this(new ConcreteAdaptee1(), new ConcreteAdaptee2() /* , ...*/)
    }

    public void method1() {
         adaptee1.method1();
    }

    public void method2() {
         adaptee1.method2();
    }

    public void method3() {
         adaptee2.method3();
    }

    public void method4() {
         adaptee2.method4();
    }
    // ...
}

public interface Adaptee1 {
    void method1();
    void method2();
}

public interface Adaptee2 {
    void method3();
    void method4();
    // ...
}
//...

public class ConcreteAdaptee1 implements Adaptee1 {
    //...
}

public class ConcreteAdaptee2 implements Adaptee2 {
    //...
}
//...

例如,如果您还需要访问其他适配器中的方法,您甚至可以在方法调用中将适配器传递给适配器。

<小时/>

但是您应该首先检查是否可以以良好的方式将类拆分为多个类(即适应者应该是独立的)。不要不惜一切代价将类(class)分成几个部分。如果您无法使适应者独立,则应将其保留为单个类,并依靠 IDE 来更轻松地导航代码(代码折叠、书签等)

关于java - 如何继承/使用多个类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25339852/

相关文章:

ruby - 我怎样才能在 ruby 中达到这个结果?

java - 来自 servlet 的静态方法

java - 展平对象并转换为列表

python - 错误 : "x instance has no attribute y" when trying to inherit from class

c++ - 如何实现订阅数据提要?通知对象

python - 过度使用 mixin 是邪恶的,有哪些替代解决方案?

java - Velocity #foreach 无法按预期工作,字符串作为 $value 变量传递

java - 如何根据关键字将解析的 JSON 消息的内容存储到字符串变量中?

javascript - 为什么需要设置原型(prototype)构造函数?

c++ - 模板 <typename T> 中的 T 可以使用继承吗?