Frage

In Java ist es möglich, Mitgliederdaten in einer Unterklasse außer Kraft zu setzen und haben die überschriebene Version die Daten in einem Superklasse-Implementierung verwendet werden?

Mit anderen Worten, hier ist, was ich versuche zu passieren zu bekommen, und es ist nicht passiert:

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

Dieser Aufruf:

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

... druckt Pizza und Shoes. Ich will es das letztere stattdessen drucken.

ich erkennen, dass dies eher schlecht hierarchische OO Praxis; Ich brauchte es für einen ganz bestimmten Fall, wie ich etwas mit XML-Konfiguration und Reflexion täte.

Gibt es einen Modifikator, der dies geschehen kann machen?

Und ja, ich erkennen, dass es Wrapper ein, um dieses Problem zu bekommen in meiner Unterklasse verwenden kann, das heißt durch die Angabe, dass der Inhalt von stuff[] jetzt in einem Array mit einem anderen Namen gespeichert wird, zum Beispiel. Ich versuche nur, diese einfach zu halten, und bin gespannt, im Prinzip.

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Ich glaube, Sie müssen ein Accessormethode dazwischenstellen, das heißt, zu verwenden:

    for(String p : getStuff()) { 

in der übergeordneten Klasse, und fügen Sie:

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

, wo Sie eine protected String[] stuff Neudefinition haben.

Übergeordnete gilt eigentlich für Methoden, die Daten nicht (zumindest, dass so in dem Java-Modell ist, einige andere Sprachen tun Dinge anders), und so die Überschreibung-Effekt zu erhalten, müssen Sie eine Methode dazwischenstellen (typischerweise ein schmutz einfachen Accessor, wie hier). Es ist nicht wirklich die Dinge komplizieren überhaupt, es ist nur eine sehr einfache Möglichkeit, die Java-Compiler anweisen, an mich zu verwenden, die „extra Dereferenzierungsebene“, dass das gewünschte Verhalten erfordert.

Andere Tipps

Auf diese Weise kann die übergeordneten Variable Sachen mit den definierten Sachen versteckt.

Versuchen Sie Wert auf Sachen im Initialisierungsbaustein (oder im Konstruktor) geben:

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

Wenn Sie das Array des String-Stuff in abgeleiteten Klasse definiert drucken, dann müssen Sie die Methode readStuff in der Klasse außer Kraft zu setzen Hard nach der Methode in der Klasse Hard neu zu definieren. Da das Verfahren readStuff in der abstrakten Klasse definiert wurde BasicStuff, daher wäre es nur die Mitglieder der Klasse BasicStuff drucken. Daher auch die gleiche Methode in der derieved Klasse hinzuzufügen. Im Folgenden finden Sie den vollständigen Code finden ..

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();
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top