1

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.

Sonu Mishra
  • 1,659
  • 4
  • 26
  • 45

3 Answers3

1

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);
}
MiguelKVidal
  • 1,498
  • 1
  • 15
  • 23
1

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();
} 
shmosel
  • 49,289
  • 6
  • 73
  • 138
ssc327
  • 690
  • 1
  • 9
  • 19
1

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();
Kalani
  • 56
  • 2