12 Stimmen

Java: Erweitern von inneren Klassen

Ich versuche, das Erweitern von inneren Klassen in Java zu verstehen. Ich habe mich umgeschaut, aber nichts gefunden, was meine Frage wirklich beantwortet. Also, los geht's...

Ich habe...

public class Pie{
    protected Slice[] slices;

    // Konstruktor für Pie
    public Pie(int n){
         sliceGenerator(n)
    }

    private void sliceGenerator(int n){
         slices = new Slice[n];
         final float sweepAngle = 360.0f/(float)n;
         float startAngle = 0;
         for (int i=0;i

``

Dann erweitere ich dies...

public class ApplePie extends Pie{
    protected Slice[] slices;

    // Apple Pie Konstruktor
    public ApplePie(int n){
         super(n);
    }

    // Innere Klasse...
    public class Slice extends Pie.Slice{
        public Slice(float startAngle){
            super(startAngle);
            //setze einige **zusätzliche** private Felder basierend auf startAngle **spezifisch für den Apfelkuchen** Apfeligkeit oder so
        }

        @Override
        public String toString(){
             return **String basierend auf spezifischen privaten Feldern des Apfelkuchens**
        }
    }
}

Jetzt, wenn ich einen Apfelkuchen erstelle und seine toString-Methode aufrufe, wie folgt...

ApplePie ap = new ApplePie(8);
System.out.println(ap.toString());

Bekomme ich keine Informationen über die Apfelkuchenscheiben, sondern Informationen über die Kuchenscheiben. Es ignoriert meine toString-Überschreibung oder ignoriert höchstwahrscheinlich meine Apfelkuchen-Slice. Wie kann ich es so anordnen, dass Apfelkuchenscheiben auf ApplePie verweisen?

Jede Hilfe ist sehr geschätzt! Entschuldigung für die Kuchenreferenzen - das ist die tatsächliche Klasse, mit der ich arbeite...

``

7voto

farmer1992 Punkte 7280

Ich habe deinen Code geändert, um deinen Anforderungen zu entsprechen.

Deine Superklasse Pie soll eine neue Instanz von Slice erstellen, aber die Kindklasse ApplePie's Slice überschreibt nicht die Slice Methode ihrer Superklasse.

Ich habe die folgenden Funktionen hinzugefügt, um der Kindklasse zu ermöglichen, ihren eigenen Slice zu erstellen.

protected void newSliceArray(int n) {
    slices = new Slice[n];
}

protected Slice newSlice(float startAngle) {
    return new Slice(startAngle);
}

Pie.java:

public class Pie {
  private int a = 1;
  protected Slice[] slices;

  // Konstruktor für Pie
  public Pie(int n) {
    sliceGenerator(n);
  }

  private void sliceGenerator(int n) {
    newSliceArray(n);
    final float sweepAngle = 360.0f / n;
    float startAngle = 0;
    for (int i = 0; i < n; i++) {
      slices[i] = newSlice(startAngle);
      startAngle += sweepAngle;
    }
  }

  protected void newSliceArray(int n) {
    slices = new Slice[n];
  }

  protected Slice newSlice(float startAngle) {
    return new Slice(startAngle);
  }

  @Override
  public String toString() {
    String t = "";
    for (Slice s : slices) {
      t += s.toString();
    }
    return t;
  }

  // Innere Klasse...
  public class Slice {
    public Slice(float startAngle) {
      // setze einige private Felder basierend auf startAngle und allgemeinem Kuchen
    }

    @Override
    public String toString() {
      return "" + a;
    }
  }
}

ApplePie.java:

public class ApplePie extends Pie {
  private int b = 2;

  // protected Slice[] slices;

  // Konstruktor für Apple Pie
  public ApplePie(int n) {
    super(n);
  }

  protected void newSliceArray(int n) {
    slices = new Slice[n];
  }

  protected Slice newSlice(float startAngle) {
    return new Slice(startAngle);
  }

  // Innere Klasse...
  public class Slice extends Pie.Slice {
    public Slice(float startAngle) {
      super(startAngle);
      // setze einige **zusätzliche** private Felder basierend auf startAngle **spezifisch für den Apfelkuchen**
      // Apfelhaftigkeit oder so etwas
    }

    @Override
    public String toString() {
      return b + "";
    }
  }
}

Test:

public static void main(String[] args) {
    ApplePie ap = new ApplePie(8);
    System.out.println(ap.toString());
}

Der Code wird 22222222 ausgeben

4voto

Paul Bellora Punkte 52854

In Ihrer Superklasse erstellen und speichern Sie Pie.Slice-Objekte:

private void sliceGenerator(int n){
     slices = new Slice[n];
     final float sweepAngle = 360.0f/(float)n;
     float startAngle = 0;
     for (int i=0;i

``

Diese sind dieselben Objekte, die von Pie.toString verwendet werden (was ApplePie übrigens nicht überschreibt).

Das Erweitern von Pie mit ApplePie und von Pie.Slice mit ApplePie.Slice ändert daran nichts. Das new Slice(startAngle) im obigen Code wechselt nicht magisch zu etwas anderem Instanziieren.

Abgesehen davon gibt Ihr Pie.toString() nichts zurück - es sollte nicht einmal kompilieren:

@Override
public String toString(){
     for (Slice s:slices){  
         s.toString();
     }
}

Ich vermute, Sie möchten einen String zurückgeben, der alle Slices repräsentiert. Hier wäre zum Beispiel eine schnelle Lösung:

@Override
public String toString() {
     return Arrays.toString(slices);
}

(Arrays.toString ist nur eine Hilfsmethode, um eine String-Repräsentation eines Arrays zu erhalten.)

``

1voto

CuriousMind Punkte 3075

Die Antwort liegt in Ihrem Programm. Wenn Sie die Klasse Slice instanziieren, ruft sie die Oberklasse auf und ruft sliceGenerator auf. Diese Methode erstellt intern Instanzen von Pie.Slice und nicht von ApplePie.Slice. Um dies zu umgehen, sollte die Methode sliceGenerator geschützt sein und in der Apple.Slice-Klasse überschrieben werden. Erstellen Sie die Instanzen von Apple.Slice und es sollte funktionieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X