请处理这个基本问题。
我有一个abstract class C1
扩展了另一个abstract class C0
,并被多个sub-classes (C21 and C22)
扩展了。
@Component
public abstract class C0 {
protected abstract String getCaller();
//Some other methods.
}
。
public abstract class C1 extends C0 {
//Set of methods which are used by children and then calls methods of C0 which then use getCaller();
}
。
@Controller
public class C21 extends C1 {
@RequestMapping(value = "abc", method = RequestMethod.GET)
public String start(@RequestParam(value = "kw", required = true) String p1,
@RequestParam(value = Constant.REQUEST_PARAM_KEYWORDID, required = true) long p2) throws Exception {
//Some processing and calls controllers defined in abstract class C1
return "200";
}
@Override
protected String getCaller() {
return "C21";
}
}
。
@Controller
public class C22 extends C1 {
@RequestMapping(value = "abc", method = RequestMethod.GET)
public String start(@RequestParam(value = "kw", required = true) String p1,
@RequestParam(value = Constant.REQUEST_PARAM_KEYWORDID, required = true) long p2) throws Exception {
//Some processing and calls controllers defined in abstract class C1
return "200";
}
@Override
protected String getCaller() {
return "C22";
}
}
C0包含抽象方法
getCaller();
C21和C22的调用者不同,但是可以通过仅传递给这些类的方法start(p1,p2)
的参数来识别它们。start(p1,p2)
在两个类中都做类似的事情。 C21和C22的唯一区别是getCaller()
的实现是固定的,并且始终可以从启动参数中提取。因此,我决定创建单一类而不是C21和C22。我无法创建
setCaller()
,因此,我想在抽象final method
中创建一个caller
和一个私有变量class C1
,这些变量可以用start
方法的参数填充并在getCaller()
中返回(称为来自abstract class C0
)。这是正确的方法吗?有没有更好的方法或模式呢?
最佳答案
C21和C22的唯一区别是getCaller()的实现是固定的,并且始终可以从start参数中提取。
由于只需要更改一个方法,因此最好使用单个非抽象实现C1
而不是抽象的C1
和一对C21
和C22
。您可以执行以下操作:
Caller caller;
public start(SomeType1 p1, SomeType2 p2, SomeType3 p3) {
caller = new Caller(p1, p2, p3);
...
// Do other stuff
}
public Caller getCaller() {
return caller;
}
如果除
C21
和C22
之外还有其他类继承C1
,则您可能希望保留C1
抽象,并通过上述实现添加一个非抽象的C2
。关于java - 基本的Java重构:将子类的差异委派给父类并合并/删除它们,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14673076/