重写成员数据的子类中,超类实现使用?(Override member data in subclas

2019-08-08 01:57发布

在Java中,是有可能重写数据成员在子类中,并有一个重写版本是一​​个超类的实现中使用的数据?

换句话说,这里就是我试图去发生,而且没有发生:

abstract public class BasicStuff {
        protected String[] stuff = { "Pizza", "Shoes" };

        public void readStuff() {
                for(String p : stuff) { 
                        system.out.println(p); 
                }
        }
}

..

public class HardStuff extends BasicStuff {
        protected String[] stuff = { "Harmonica", "Saxophone", "Particle Accelerator" };
}

这个调用:

HardStuff sf = new HardStuff();
sf.readStuff();

...打印PizzaShoes 。 我想它打印后者代替。

我承认,这是比较差的分层OO实践; 我需要它一个非常特殊的情况下,我做的与XML配置和反思的东西。

是否有修改,可以做到这一点?

是的,我也认识到,有包装可以使用来解决我的子类此问题,说明的内容,即stuff[]现在存储在数组中使用不同的名称,例如。 我只是想保持这个简单,我在原则好奇。

非常感谢提前!

Answer 1:

我相信你一定干预的存取方法,即使用:

    for(String p : getStuff()) { 

在超类中,并添加:

    protected String[] getStuff() { return stuff; }

只要您有一个protected String[] stuff重新定义。

重写真正适用的方法,而不是数据(至少是这样的Java模型;其他一些语言做不同的事情),所以得到覆盖效果,你必须干预的方法(通常是污垢简单的访问,喜欢这里)。 它并不真正的东西都复杂,它只是一个指示Java编译器使用的,本质的,你想要的行为,需要“间接的额外水平”非常简单的方法。



Answer 2:

这样,您就与定义的东西隐藏父变量的东西。

先给值在初始化块的东西(或在构造函数中):

abstract public class BasicStuff {
  protected String[] stuff;

  {
    stuff = new String[] { "Pizza", "Shoes" };
  }

  public void readStuff() {
    for(String p : stuff) { 
      System.out.println(p); 
    }
  }
}

..

public class HardStuff extends BasicStuff {
  {
    stuff = new String[] { "Harmonica", "Saxophone", "Particle Accelerator" };
  }
}


Answer 3:

如果你想打印字符串的东西在派生类中定义的数组,那么你需要重新定义在类麻醉药的方法来覆盖类麻醉药的方法readStuff。 作为该方法readStuff在抽象类定义BasicStuff,因此它会仅打印类BasicStuff的成员。 因此,在derieved类添加相同的方法了。 下面你可以找到完整的代码..

class BasicStuff {
    protected String[] stuff = { "Pizza", "Shoes" };

    public void readStuff() {
            for(String p : stuff) { 
                    System.out.println(p); 
            }
    }
}


public class HardStuff extends BasicStuff {
    protected String[] stuff = 
              { "Harmonica", 
                "Saxophone", 
                "Particle Accelerator" 
              };

    public void readStuff() {
            for(String p : stuff) { 
                    System.out.println(p); 
            }
    }
    public static void main(String []arg)
    {
     HardStuff sf = new HardStuff();
        sf.readStuff();
    }
}


文章来源: Override member data in subclass, use in superclass implementation?