【问题标题】:Update fields from superclass从超类更新字段
【发布时间】:2013-10-29 12:46:14
【问题描述】:

从各种模式的角度来看,从其后代更改超类中的字段是可以接受的。例如:

class A {
    int barA;
}

class B extends A {
    private void testMethod() {
        barA = 4;
    }
}

提前致谢!

【问题讨论】:

  • 子类可以访问所有公共的、受保护的和默认的(bakage)实例变量和方法,但它不能访问私有的。但是,最好将所有实例变量设为私有并通过访问器和修改器访问它们。

标签: java oop design-patterns anti-patterns


【解决方案1】:

如果您想在子类中更改它们的值,最好将所有字段设为私有,并提供公共或受保护的设置器。

【讨论】:

    【解决方案2】:

    不,这通常不是一个好主意。如果我明白你在问什么,通常会这样做

    public class A{
         private int val;
    
         protected void setVal(int i){
            val = i;
         }
    
         public int getVal(){
            return val;
         }
    }
    
    public class B extends A{
        public void test(){
            this.setVal(4);
        }
    } 
    

    【讨论】:

      【解决方案3】:

      是的,这很好。如果超类不希望子类修改值,则可以将它们设为私有。

      【讨论】:

      • final 将阻止更改超类的值:)
      • @Dedyshka 没错!
      【解决方案4】:

      当我们说 B 类扩展 A 时,我们的意思是它也继承了它的所有(超类,即 A)变量。所以现在 B 有了自己的变量 barA。因此,您可以像任何其他成员变量一样更改它。进一步阅读this

      【讨论】:

        【解决方案5】:

        这样做是可以的,但你为什么不创建一个getter/setter 呢?使用它们而不是直接修改要好得多。

        如果您不想在子类中修改这些值,请将它们设为final

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多