覆盖访问私有成员

时间:2017-07-27 23:49:15

标签: java inheritance

我正在开发一个庞大的代码库,它有一个庞大的类,有许多私有成员以及公共和私有方法。我想从这个基类创建一个派生类,它将拥有所有相同的成员和方法,除了它的一个公共方法将有一行注释。我怎么能这样做?

我想过覆盖那个方法,但是该方法访问了基类的许多私有成员。

以下是我想要做的骨架。

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()覆盖为空是不可行的,因为它可以被其他非重写方法使用。

3 个答案:

答案 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();