在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();
...打印Pizza
和Shoes
。 我想它打印后者代替。
我承认,这是比较差的分层OO实践; 我需要它一个非常特殊的情况下,我做的与XML配置和反思的东西。
是否有修改,可以做到这一点?
是的,我也认识到,有包装可以使用来解决我的子类此问题,说明的内容,即stuff[]
现在存储在数组中使用不同的名称,例如。 我只是想保持这个简单,我在原则好奇。
非常感谢提前!
我相信你一定干预的存取方法,即使用:
for(String p : getStuff()) {
在超类中,并添加:
protected String[] getStuff() { return stuff; }
只要您有一个protected String[] stuff
重新定义。
重写真正适用的方法,而不是数据(至少是这样的Java模型;其他一些语言做不同的事情),所以得到覆盖效果,你必须干预的方法(通常是污垢简单的访问,喜欢这里)。 它并不真正的东西都复杂,它只是一个指示Java编译器使用的,本质的,你想要的行为,需要“间接的额外水平”非常简单的方法。
这样,您就与定义的东西隐藏父变量的东西。
先给值在初始化块的东西(或在构造函数中):
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" };
}
}
如果你想打印字符串的东西在派生类中定义的数组,那么你需要重新定义在类麻醉药的方法来覆盖类麻醉药的方法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();
}
}