我有一个超级抽象类,由几个方法组成。这些方法应该按顺序执行。我想让方法被覆盖,但不要改变方法执行的顺序。此外,需要分析每种方法的返回类型以执行下一种方法。每种方法的返回值的类型可以改变。因此,应该允许返回对象的分析在子类中进行。
public abstract class TaskManageer {
public abstract <A> A init();
public abstract <B> B start();
public abstract <C> C shutDown();
public final boolean runManager(){
init();
start();
shutDown();
}
}
方法runManager()已被设为'final',因此子类无法更改顺序。但是,init()方法的输出需要在start()方法之前进行分析。此外,需要输出start()方法来开始shutDown()方法。
应允许对子类进行此分析。
任何人都让我知道如何实现这一目标。
答案 0 :(得分:2)
由于您的分析应基于您的方法返回的类型,因此您需要在类上定义类型。
public abstract class TaskManager<A, B, C> {
public abstract A init();
public abstract B start();
public abstract C shutDown();
public abstract void analyzeAfterInit(A initResult);
public abstract void analyzeAfterStart(B startResult);
public final booelan runManager(){
A initResult = init();
analyzeAfterInit(initResult);
B startResult = start();
analyzeAfterStart(startResult);
shutDown();
}
}
*增加:
如果您对通用参数的类型有特定要求,可以使用bounded type parameters,例如TaskManager<A, B, C extends Number>
可能的子类可能如下所示:
public class MyTaskManager extends TaskManager<String, Process, Integer> {
// private fields ....
public String init() {
return "echo 'Hello'";
}
public Process start() {
Process p = new Process(this.command);
p.start();
return p;
}
public Integer shutDown() {
int exitCode = this.process.stop();
return exitCode;
}
public void analyzeAfterInit(String initResult) {
this.command = initResult;
verifyCommand(initResult);
}
public void analyzeAfterStart(Process startResult) {
this.process = startResult;
}
}
答案 1 :(得分:2)
我会将先前方法的结果作为参数传递。然后,下一个方法可以使用它。
由于您要确保方法的正确顺序,还要确保无法从外部调用继承的方法,因此将可见性更改为protected
而不是public
。
public abstract class TaskManageer <A, B, C> {
protected abstract A init();
protected abstract B start(A a);
protected abstract C shutDown(B b);
public final boolean runManager(){
A a = init();
B b = start(a);
C c = shutDown(b);
return c.getResult();
}
}