Java 对抽象方法强制执行公共初始化步骤
我目前正在重构一组可以简化为以下内容的类:Java 对抽象方法强制执行公共初始化步骤,java,oop,inheritance,Java,Oop,Inheritance,我目前正在重构一组可以简化为以下内容的类: public abstract class A { public abstract Output doStuff(Input in); } public class B extends A { public Output doStuff(Input in) { // dostuff and return an output } } 现在,我想在a中添加一个字段,其值是从中的输入中派生出来的,最好不要更改子
public abstract class A {
public abstract Output doStuff(Input in);
}
public class B extends A {
public Output doStuff(Input in) {
// dostuff and return an output
}
}
现在,我想在a
中添加一个字段,其值是从中的输入中派生出来的,最好不要更改子类中的任何内容(大约有20个类,如B
)
基本上,我想找到一种方法,在doStuff()
的每次调用中调用init
方法(见下文),而不必在类a
中实现该方法,也不必在类扩展a中更改内容
你知道有什么优雅的方法吗
public abstract class A {
private Object property;
public abstract Output doStuff(Input in);
private init(Input in){
property=in.getProperty();
}
}
public class B extends A {
public Output doStuff(Input in) {
// dostuff and return an output
}
}
您只需在a
中编写一个方法,该方法调用init()
方法和doStuff()
方法。这样,每个子类都会自动调用init()
方法
public abstract class A {
private Object property;
public Output doStuffWithInit(Input in) {
this.init(in);
return this.doStuff(in);
}
public abstract Output doStuff(Input in);
private init(Input in){
property=in.getProperty();
}
}
必须将消费类更改为调用dostufwithinit()
,以确保每次调用init()
。为什么您有一个不能更改a
的限制?我可以更改a,我写道我不希望更改从a继承的类,虽然这更像是一种偏好而非限制,但一个显而易见的解决方案是在a中实现doStuff,这样它就可以调用init并返回任何内容,然后将B类更改为在执行它们的操作之前调用super(in)。但是我发现它很难看,因此问题是如果你不想改变子类,那么现在就用纯面向对象的方法来引入它已经太迟了。你可能想看看像AOP这样的特技。正如我所说的,这更像是一种偏好。如果一个涉及改变子类的解决方案能够证明自己是优雅的,我也很乐意接受它。然而,也有一些消费类,所以我宁愿不这样划分。如果在较新版本的java中没有新的奇特方法,我会选择这种解决方案。感谢您的回答,在接受它之前我将稍等:-)现在这将打破直接在子类类型实例上调用doStuff()
的现有客户端。