Search code examples
javainheritanceclass-designsubclass

Override member data in subclass, use in superclass implementation?


In Java, is it possible to override member data in a subclass and have that overridden version be the data used in a super class's implementation?

In other words, here's what I am trying to get to happen, and it's not happening:

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" };
}

This invocation:

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

... prints Pizza and Shoes. I want it to print the latter instead.

I recognise that this is rather poor hierarchical OO practice; I needed it for a very specific case as I am doing something with XML configuration and reflection.

Is there a modifier that can make this happen?

And yes, I do recognise that there are wrappers one can use to get around this problem in my subclass, i.e. by indicating that the contents of stuff[] are now stored in an array with a different name, for instance. I'm just trying to keep this simple, and am curious in principle.

Thanks a lot in advance!


Solution

  • I believe you must interpose an accessor method, i.e., use:

        for(String p : getStuff()) { 
    

    in the superclass, and add:

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

    wherever you have a protected String[] stuff redefinition.

    Overriding really applies to methods, not data (at least, that is so in the Java model; some other languages do things differently), and so to get the override effect you must interpose a method (typically a dirt-simple accessor, like here). It doesn't really complicate things at all, it's just a very simple way to instruct the Java compiler to use, intrinsically, the "extra level of indirection" that your desired behavior requires.