Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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!

like image 277
Alex Balashov Avatar asked Dec 04 '22 14:12

Alex Balashov


1 Answers

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.

like image 120
Alex Martelli Avatar answered Jan 03 '23 09:01

Alex Martelli