重构如果(... instanceof ...)

Chr*_*ris 4 java oop

我目前正在尝试重构一个看起来像这样的项目的一部分:

很多班

 B extends A; C extends A; D extends C; E extends B; F extends A; ...
Run Code Online (Sandbox Code Playgroud)

在代码的某处:

if (x instanceof B){
 B n = (B) x;
 ...
}else if (x instanceof C){
 C n = (C) x;
 ...
}else if (x instanceof D){
 D n = (D) x;
 ...
}else if (x instanceof E){
 E n = (E) x;
 ...
}else if (x instanceof G){
 G n = (G) x;
 ...
}...
Run Code Online (Sandbox Code Playgroud)

上面的if-construct目前位于一个CC为19的函数中.现在我的问题是:我可以将这个if-construct拆分为多个函数并让Java的OO做神奇吗?或者有什么捕获我需要注意的?

我的想法:

private void oopMagic(C obj){ ... Do the stuff from the if(x instanceof C) here}
private void oopMagic(D obj){ ... Do the stuff from the if(x instanceof D) here}
private void oopMagic(E obj){ ... Do the stuff from the if(x instanceof E) here}
....
Run Code Online (Sandbox Code Playgroud)

而不是巨大的if:

oopMagic(x);
Run Code Online (Sandbox Code Playgroud)

编辑:我无法更改任何类(A,B,C,...).在if语句中,一些getter用于从每个对象读取(从不写入)数据.

Lit*_*les 5

那不会飞.instanceof检测变量的运行时类型.多态性(通过签名选择方法)取决于变量的编译时类型.也就是说,你永远都会得到oopMagic(A obj).

正如罗杰建议的那样,看看访客模式,即双重调度.