如何从多个类继承/使用方法

时间:2014-08-16 11:46:59

标签: java inheritance design-patterns refactoring

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

因为基础类变得越来越大,所以我试图将这些常用方法移动到新创建的类中,以改善项目的模块性。原始基类继承了那些新创建的类的方法。 (多重继承?)

有没有建议重构这个?还需要最小化对子类的影响。最小的代码更改将是完美的..

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

2 个答案:

答案 0 :(得分: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来代替更轻松地导航代码(代码折叠,书签......)

答案 1 :(得分:0)

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

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

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

示例:

public class SuperBaseClass{
method1()
method2()
method3()
}

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

你甚至可以创建一个SuperDuperBaseClass,SuperBaseClass扩展到你想要的范围内继续链接。这种技术的问题在于它会强制您的项目采用层次结构。

2)您可以将Base类拆分为多个其他基类(我建议使用此类)。将您的方法分类为类别,并将它们放在适当命名的基类中。例如,将所有将数字压缩的方法抛出到一个名为Algorithms的类中。将所有与项目中的其他类和功能相关联的方法放入一个名为Tools的类中。这样做直到您的整个项目分类。它将尽可能地清理所有内容,并在将来保持可管理性。这个问题是你将不得不改变以前引用的Base类。

3)您可以按原样保留Base类。因为它只是一个支持文件,所以你不应该经常不断地浏览这些代码,所以它不会让你太过分,以免这个文件变得有点混乱。