考虑:
class C1 {
public static void doWork() {
// code fragment F1
doMoreWork();
// code fragment F2
}
private static void doMoreWork() {
// code fragment F3
}
}
class C2 {
public static void doWork() {
// code fragment F1
doMoreWork();
// code fragment F2
}
private static void doMoreWork() {
// code fragment F4
}
}
请注意doMoreWork
和C1
中的C2
代码不同,但代码在
<{1}}和doWork()
中的C1
相同。
如何重构此类结构,以便对C2
和C1.doWork()
的调用如上所述,但C2.doWork()
的代码不重复?
编辑:请注意,重构后方法必须是静态的。 此外,片段F1和F2实际上是可能具有一个或多个开放上下文的代码片段 - 例如。片段F1打开了一个&#34; {&#34;和结束&#34;}&#34;在片段F2中。
答案 0 :(得分:1)
您可以创建另一个包含您不想复制的代码的类C
。
class C {
public static void f1() { /* code fragment F1 */ }
public static void f2() { /* code fragment F2 */ }
}
然后,您可以从C
和C1
调用C2
的方法。
class C1 {
public static void doWork() {
C.f1();
doMoreWork();
C.f2();
}
private static void doMoreWork() {
// code fragment F3
}
}
class C2 {
public static void doWork() {
C.f1();
doMoreWork();
C.f2();
}
private static void doMoreWork() {
// code fragment F4
}
}
答案 1 :(得分:0)
您希望将这两种方法保持为静态这一事实会使问题显着复杂化。我甚至怀疑它可以这样做。
为什么你坚持保持静止? 通常,没有理由保持静态,因为您可以轻松地转换为静态&#34;通过创建新实例来创建非静态上下文的上下文。 而不是
C1.doWork();
你刚刚做了
new C1().doWork();
如果你不介意使用非静态方法,你可以这样做:
class C {
public void doWork() {
// code fragment F1
doMoreWork();
// code fragment F2
}
protected abstract void doMoreWork();
}
class C1 extends C {
protected void doMoreWork() {
// code fragment F3
}
}
class C2 extends C {
protected void doMoreWork() {
// code fragment F4
}
}
这只是粗略的,如果编译,我甚至都没试过。