简体   繁体   中英

Override a public method that accesses private members

I working on a huge code base which has a huge class with many private members and public and private methods. I want to create a derived class from this base class that will have all same members and methods, except that one of its public methods will have a line commented. How can I do that?

I thought of overriding that method, but that method accesses many private members of the base class.

Below is the skeleton of what I want to do.

public class Base {
    private var1;
    private var2;

    public toBeOverriden(){
       processA(var1);
       processB(var1);
       processC(var1);  // needs to be commented
       processD(var2);
       processE(var2);
   }
}

Ideally I would like to do -

public class Derived extends Base{
    @Override
    public toBeOverriden(){
       processA(var1);
       processB(var1);
       processD(var2);
       processE(var2);
   }
}

This is not possible because I cannot access private variables of the base class. Is there anything I can do without making all private members protected? Please note that overriding processC() to empty is not an option because it can be used by other non-overriden methods.

Another option:

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();
   }
}

This is "basically" a delegate for every method you need to call. You can change it to better methods that really do a job, like:

public void doSomething(){
    processA(var1);
    processB(var1);
}

If you have access to the base class you can start by making a new method that does what you want, such as correctedToBeOverridden() . Then from your extended class, override toBeOverridden() and just have it call correctedToBeOverridden() .

correctedToBeOverridden(){
    processA(var1); 
    processB(var1); 
    processD(var2);
    processE(var2);
} 

@Override 
toBeOverridden() {
    correctedToBeOverridden();
} 

Another option is to make Derived a nested class within Base to give it access to private variables:

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);
        }
    }
}

However, the instantiation of Derived will look like this:

Base.Derived derived = new Base().new Derived();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM