Domanda

In Java, è possibile sovrascrivere i dati dei membri in una sottoclasse e che hanno la versione override sia i dati utilizzati per l'attuazione di una classe di super-?

In altre parole, qui è quello che sto cercando di ottenere per accadere, e non sta succedendo:

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

Questa invocazione:

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

... stampe Pizza e Shoes. Voglio che per stampare il secondo posto.

Mi rendo conto che questo è piuttosto scarsa pratica OO gerarchica; Ne avevo bisogno per un caso molto specifico come sto facendo qualcosa con configurazione XML e la riflessione.

C'è un modificatore che può fare questo accadere?

E sì, io riconosco che ci sono involucri si può usare per aggirare questo problema nel mio sottoclasse, cioè indicando che il contenuto del stuff[] sono ora memorizzati in un array con un nome diverso, per esempio. Sto solo cercando di mantenere questo semplice, e sono curioso in linea di principio.

Grazie mille in anticipo!

È stato utile?

Soluzione

Credo che si deve interporre un metodo di accesso, vale a dire, l'uso:

    for(String p : getStuff()) { 

nella superclasse, e aggiungere:

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

ovunque ci sia una ridefinizione protected String[] stuff.

Esclusione si applica davvero a metodi, non i dati (almeno, che è così nel modello Java; alcune altre lingue fanno le cose in modo diverso), e in modo da ottenere l'effetto di sostituzione è necessario interporre un metodo di (tipicamente una funzione di accesso allo sporco semplice, come qui). Realmente non complicare le cose a tutti, è solo un modo molto semplice per indicare al compilatore Java da utilizzare, intrinsecamente, il "ulteriore livello di riferimento indiretto" che il vostro comportamento desiderato richiede.

Altri suggerimenti

In questo modo si sta nascondendo la roba variabile genitore con la roba definito.

Prova a dare valore alle cose nel blocco di inizializzazione (o nel costruttore):

abstract public class BasicStuff {
  protected String[] stuff;

  {
    stuff = new String[] { "Pizza", "Shoes" };
  }

  public void readStuff() {
    for(String p : stuff) { 
      System.out.println(p); 
    }
  }
}

..

public class HardStuff extends BasicStuff {
  {
    stuff = new String[] { "Harmonica", "Saxophone", "Particle Accelerator" };
  }
}

Se si desidera stampare la matrice della stringa Stuff definito nella classe derivata allora avete bisogno di sovrascrivere il metodo readStuff nella classe HardStuff ridefinendo il metodo nella classe HardStuff. Come metodo readStuff è stato definito nella classe astratta BasicStuff, quindi sarebbe stampare soltanto i membri della classe BasicStuff. Quindi, aggiungere lo stesso metodo nella classe derieved troppo. Qui di seguito potete trovare il codice completo ..

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

    public void readStuff() {
            for(String p : stuff) { 
                    System.out.println(p); 
            }
    }
    public static void main(String []arg)
    {
     HardStuff sf = new HardStuff();
        sf.readStuff();
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top