我正在开发一个庞大的代码库,它有一个庞大的类,有许多私有成员以及公共和私有方法。我想从这个基类创建一个派生类,它将拥有所有相同的成员和方法,除了它的一个公共方法将有一行注释。我怎么能这样做?
我想过覆盖那个方法,但是该方法访问了基类的许多私有成员。
以下是我想要做的骨架。
public class Base {
private var1;
private var2;
public toBeOverriden(){
processA(var1);
processB(var1);
processC(var1); // needs to be commented
processD(var2);
processE(var2);
}
}
理想情况下我想做 -
public class Derived extends Base{
@Override
public toBeOverriden(){
processA(var1);
processB(var1);
processD(var2);
processE(var2);
}
}
这是不可能的,因为我无法访问基类的私有变量。如果不保护所有私人会员,我能做些什么吗?请注意,将processC()
覆盖为空是不可行的,因为它可以被其他非重写方法使用。
答案 0 :(得分:1)
另一种选择:
public class Base {
private var1;
private var2;
public toBeOverriden(){
doMethodA();
doMethodB();
doMethodC();
doMethodD();
doMethodE();
}
protected void doMethodA(){ processA(var1); }
protected void doMethodB(){ processA(var1); }
protected void doMethodC(){ processA(var1); }
protected void doMethodD(){ processA(var2); }
protected void doMethodE(){ processA(var2); }
}
public class Derived extends Base{
@Override
public toBeOverriden(){
doMethodA();
doMethodB();
doMethodD();
doMethodE();
}
}
这基本上是您需要调用的每个方法的委托。 您可以将其更改为更好的方法来实现工作,例如:
public void doSomething(){
processA(var1);
processB(var1);
}
答案 1 :(得分:1)
如果您有权访问基类,则可以先创建一个符合您需要的新方法,例如correctedToBeOverridden()
。然后,从您的扩展类中覆盖toBeOverridden()
,然后调用correctedToBeOverridden()
。
correctedToBeOverridden(){
processA(var1);
processB(var1);
processD(var2);
processE(var2);
}
@Override
toBeOverridden() {
correctedToBeOverridden();
}
答案 2 :(得分:1)
另一个选择是在Base中使Derived成为嵌套类,以使其能够访问私有变量:
public class Base {
private int var1;
private int var2;
private void processA(int a){}
private void processB(int a){}
private void processC(int a){}
private void processD(int a){}
private void processE(int a){}
public void toBeOverriden(){
processA(var1);
processB(var1);
processC(var1); // needs to be commented
processD(var2);
processE(var2);
}
public class Derived extends Base{
@Override
public void toBeOverriden(){
processA(var1);
processB(var1);
//processC(var1); // needs to be commented
processD(var2);
processE(var2);
}
}
}
然而,Derived的实例化将如下所示:
Base.Derived derived = new Base().new Derived();