【问题标题】:Override a public method that accesses private members覆盖访问私有成员的公共方法
【发布时间】:2017-07-27 23:49:15
【问题描述】:

我正在处理一个庞大的代码库,该代码库有一个巨大的类,其中包含许多私有成员以及公共和私有方法。我想从这个基类创建一个派生类,它具有所有相同的成员和方法,除了它的一个公共方法将有一行注释。我该怎么做?

我曾想过重写该方法,但该方法访问了基类的许多私有成员。

下面是我想做的事情的骨架。

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() 覆盖为空不是一种选择,因为它可以被其他非覆盖方法使用。

【问题讨论】:

  • 也许这可以帮助你:stackoverflow.com/questions/215497/…
  • 为什么不直接覆盖processC() 让它什么都不做?
  • 您可能需要更新代码 sn-p 以反映 Derived 扩展 Base 的事实
  • 因为 processC() 也被 processD() 使用
  • 所以创建另一个方法processC2() 调用processC() 并覆盖它。

标签: java inheritance


【解决方案1】:

如果您有权访问基类,则可以先创建一个新方法来满足您的需求,例如correctedToBeOverridden()。然后从您的扩展类中,覆盖toBeOverridden() 并让它调用correctedToBeOverridden()

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

@Override 
toBeOverridden() {
    correctedToBeOverridden();
} 

【讨论】:

    【解决方案2】:

    另一种选择:

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

    【讨论】:

      【解决方案3】:

      另一种选择是让 Derived 成为 Base 中的嵌套类,以使其能够访问私有变量:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-22
        • 1970-01-01
        • 2011-11-02
        • 2016-06-06
        • 1970-01-01
        • 2014-10-27
        • 1970-01-01
        相关资源
        最近更新 更多