覆盖子类中的成员数据,用在超类实现中?

亚历克斯·巴拉索夫(Alex Balashov):

在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[]现在存储在具有不同名称的数组中。我只是想保持简单,原则上很好奇。

在此先多谢!

亚历克斯·马特利(Alex Martelli):

我相信您必须插入访问器方法,即使用:

    for(String p : getStuff()) { 

在超类中,并添加:

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

无论您在哪里protected String[] stuff重新定义。

覆盖实际上适用于方法,而不是数据(至少在Java模型中是如此;其他语言则有所不同),因此,要获得覆盖效果,您必须插入一个方法(通常是一个简单的访问器,如此处所示) )。它实际上并没有使事情复杂化,它只是一种非常简单的方法,可以指示Java编译器本质上使用所需行为所需的“间接附加级别”。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章