【问题标题】:How to inherits/uses methods from multiple classes如何从多个类继承/使用方法
【发布时间】:2014-10-09 23:34:13
【问题描述】:

当前我有一个基类,其中包含项目初始化和拆卸方法,以及一些大量的常用方法,这些方法被其子类继承/使用。

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

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

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

【问题讨论】:

  • 答案将完全取决于您的具体情况。 Java 中不能有多重继承。实现多个方法的基类没有错。如果您有一种合乎逻辑的方法将基类拆分为一系列基类,每个基类都有一些方法,那也可以。这完全取决于你的类代表什么。

标签: java inheritance design-patterns refactoring


【解决方案1】:

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

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

  • 您仍然不能在接口中声明字段
  • 如果您在不同的接口中有相同方法的 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 {
    //...
}
//...

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


但是您应该首先检查该类是否可以以一种好的方式拆分为多个类(即适配者应该是独立的)。不要不惜一切代价将班级分成几部分。如果你不能让适配者独立,你应该把它作为一个单独的类,并依赖你的 IDE 来更容易地浏览代码(代码折叠、书签、...)

【讨论】:

    【解决方案2】:

    在 Java 中,一个类不能扩展多个其他类,但它可以实现任意数量的接口。不幸的是,实现接口不会提供您需要的方法。

    据我所知,您有以下选择:

    1) 如果您不想更改对基类的所有引用,并且基类有一些非常广泛的方法并且可能适用于许多类,您可以将它们放在一个类中并拥有您的基类类扩展那个。

    示例:

    public class SuperBaseClass{
    method1()
    method2()
    method3()
    }
    
    public class BaseClass extends SuperBaseClass{
    method4()
    method5()
    method6()
    }
    

    您甚至可以创建一个 SuperDuperBaseClass,SuperBaseClass 扩展该 SuperDuperBaseClass 以将链延续到您想要的任何位置。这种技术的问题在于它会强制您的项目使用层次结构。

    2) 您可以将 Base 类拆分为多个其他基类(我会推荐这个)。将您的方法分类并放入适当命名的基类中。例如,将所有处理数字的方法放入一个名为 Algorithms 的类中。将所有与项目中的其他类和功能相关联的方法放入一个名为 Tools 的类中。这样做,直到您的整个项目被排序。它将尽可能地清理一切,并在未来保持事情的可管理性。这样做的问题是,您必须在任何地方更改曾经引用的 Base 类。

    3) 您可以保留 Base 类的原样。由于它只是一个支持文件,因此您实际上不必经常挖掘该代码,因此该文件变得有点混乱不会让您有太多的阻碍。

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 1970-01-01
      • 2010-11-24
      • 2013-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多