Polymorphism 可能还有抽象和封装是你的朋友。
你应该在.... // do some things 部分更好地指定你有什么样的指令。如果您总是使用相同的信息,但用它做不同的事情,那么使用简单的多态性解决方案相当容易。请参阅我对此答案的第一次修订。我假设您需要不同的信息来完成每种情况下的特定任务。
您也没有指定这些函数是否在同一个类/模块中。如果不是,您可以使用继承来共享公共部分,并使用多态性在特定部分中引入不同的行为。如果它们在同一个类中,则不需要继承或多态。
在不同的班级
考虑到您在问题中指出,您可能需要根据实现子类调用具有不同签名的函数(例如,根据情况传递a 或b 作为参数),并假设您需要在具体实现中对中间局部变量(即a 和b)做一些事情:
短版:多态性+封装:将每个子类可能需要的所有可能的输入和输出参数传递给抽象函数。如果将它们封装在一个对象中,可能会不那么痛苦。
加长版
我会将中间状态存储在泛型类的成员中,并将其传递给实现方法。或者,您可以从实现方法中获取状态,而不是将其作为参数传递。然后,您可以创建它的两个子类来实现doSpecificStuff(State) 方法,并从超类的中间状态中获取所需的参数。如果超类需要,子类也可以修改状态。
(接下来是 Java 细节,抱歉)
public abstract class Generic {
private State state = new State();
public void a() {
preProcess();
prepareState();
doSpecificStuf(state);
clearState();
return postProcess();
}
protected void preProcess(){
a = getA;
b = getB;
b.doStuff();
}
protected Object postProcess(){
b.send()
return a - b;
}
protected void prepareState(){
state.prepareState(a,b);
}
private void clearState() {
state.clear();
}
protected abstract doSpecificStuf(State state);
}
public class Specific extends Generic {
protected doSpecificStuf(State state) {
state.getA().doThings();
state.setB(someCalculation);
}
}
public class Specific2 extends Generic {
protected doSpecificStuf(State state) {
state.getB().doThings();
}
}
同班
另一种可能性是让preProcess() 方法返回一个State 变量,并在a1() 和a2() 的实现中使用它。
public class MyClass {
protected State preProcess(){
a = getA;
b = getB;
b.doStuff();
return new State(a,b);
}
protected Object postProcess(){
b.send()
return a - b;
}
public void a1(){
State st = preProcess();
st.getA().doThings();
State.clear(st);
return postProcess();
}
public void a2(){
State st = preProcess();
st.getB().doThings();
State.clear(st);
return postProcess();
}
}