重写子类中的成员数据,在超类实现中使用?

2024-01-13

在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 and Shoes。我希望它打印后者。

我认识到这是相当糟糕的分层面向对象实践;我需要它来处理非常特殊的情况,因为我正在使用 XML 配置和反射做一些事情。

有没有一个修改器可以实现这一点?

是的,我确实认识到可以使用包装器来解决我的子类中的这个问题,即通过指示stuff[]例如,现在存储在具有不同名称的数组中。我只是想保持简单,并且原则上很好奇。

预先非常感谢!


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

    for(String p : getStuff()) { 

在超类中,并添加:

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

无论你有什么地方protected String[] stuff重新定义。

覆盖真正适用于方法,而不是数据(至少,在 Java 模型中是如此;其他一些语言的做法有所不同),因此为了获得覆盖效果,您必须插入一个方法(通常是一个非常简单的访问器,就像这里一样) 。它根本没有让事情变得复杂,它只是一种非常简单的方法来指示 Java 编译器本质上使用您所需的行为所需的“额外的间接级别”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重写子类中的成员数据,在超类实现中使用? 的相关文章

随机推荐