java - 覆盖子类中的成员数据,在父类(super class)实现中使用?

标签 java inheritance class-design subclass

在 Java 中,是否可以覆盖子类中的成员数据,并让覆盖的版本成为父类(super class)实现中使用的数据?

换句话说,这就是我想要实现的目标,但它并没有发生:

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[] 的内容现在存储在一个数组中例如,不同的名称。我只是想保持简单,并且原则上很好奇。

提前致谢!

最佳答案

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

    for(String p : getStuff()) { 

在父类(super class)中,添加:

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

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

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

关于java - 覆盖子类中的成员数据,在父类(super class)实现中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1448956/

相关文章:

c++ - 内部类声明

java - 对象变量可能尚未初始化

java - 重新打开 Lucene 索引

java - Spring 的 JedisConnectionFactory 是否支持新的 JedisCluster?

java - 创建与子类相同类型的对象

c++ - 现代 C 和 C++ : it is possible to use one defined structure for other declared structure?

java - 如何通过同一个套接字发送不同类型的数据

java - 如何在 Java 中有条件地锁定?

c# - 覆盖非虚拟属性

c++ - 为什么 template<typename T> 在 C++ 中评估为 Foo 而不是 Bar