当前我有一个包含项目init和teardown方法的基类,以及一些大量常用方法,这些方法由其子类继承/使用。
因为基础类变得越来越大,所以我试图将这些常用方法移动到新创建的类中,以改善项目的模块性。原始基类继承了那些新创建的类的方法。 (多重继承?)
有没有建议重构这个?还需要最小化对子类的影响。最小的代码更改将是完美的..
Base class
-method1()
-method2()
-method3()
-method4()
-method5()
-method6()--------
| |
| |
subclasse1 subclass2
答案 0 :(得分:1)
首先,java中没有多继承类(只有接口的多继承)。
但是在java 8中,您可以编写接口方法的默认实现(请参阅"Default Methods" on docs.oracle.com)。但是有一些限制:
您可能最好使用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类。因为它只是一个支持文件,所以你不应该经常不断地浏览这些代码,所以它不会让你太过分,以免这个文件变得有点混乱。