Auf Array in anderer Klasse zugreifen?

5 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Die x-Position solltest du dir bereits über den Konstruktor holen.

public Waggon(int xPosition) {
  this.xPosition = xPosition;
  // ...
}

oder du definierst eine setze-Funktion:

public setzeXPosition(int xPosition) {
  this.xPosition = xPosition;
}

Wenn ein neuer Waggon angehängt wird, wird die Position berechnet und ihm zugewiesen.

Bei deinem Weg müsste deine holeXPosition-Funktion noch einen Parameter zugewiesen bekommen (Array oder Zug) oder ein Feld sollte generell eine Referenz auf den Zug bekommen.

a)

public int holeXPosition(Zug zug) {
  Waggon[] waggons = zug.gibWaggons();
  // ...
}

b)

public int holeXPosition(Waggon[] waggons) {
  // ...
}

c)

class Waggon {
  private Zug zug;

  public Waggon(Zug zug) {
    this.zug = zug;
    // ...
  }

  public int holeXPosition() {
    Waggon[] waggons = zug.gibWaggons();
    // ...
  }

  // ...
}   

Bei den Varianten a und c müsste die Klasse Zug zudem um die gibWaggons-Methode erweitert werden, die einfach nur das Array liefert. Ich halte sie diese beiden gegenüber der Option b besser / logischer.

So und so brauchst du in jedem Fall eine Referenz auf das Objekt, mit dem du in deiner Methode arbeiten möchtest.

PS.: In deiner derzeitigen Implementation verwendest du eine Variable Waggon. Selbst wenn diese definiert wäre, überschneidet sie sich mit dem Klassennamen, verstößt gegen allgemeine Konventionen (beginnt mit einem Großbuchstaben) und drückt nicht wahrheitsgemäß aus, was sie enthält (der Plural waggons wäre passender).

  1. normal würde man jedem Objekt Waggon eine Referenz auf iReihung und auf WaggonArray mitgeben...
  2. oder ein Waggon kann sein „x“ eben nicht wissen... dann müsste man dessen xPosi in der Klasse Zug bestimmten...
  3. oder man versucht durch die diversen Referenzen hinauf zu navigieren... das ist aber ziemlich unsauber... :)
Woher ich das weiß:Studium / Ausbildung

Irgendwie versteh ich nicht, was der Code bewirken soll. xPosition ist doch ein normaler Integer. "holeXPosition" klingt für mich nach einem simplen Getter. Also reicht es, wenn du es so machst:

public int holeXPosition() {
  return xPosition;
}

Vermutlich habe ich aber nicht ganz verstanden, was Du mit dem Code erreichen willst.

Ich kann nicht nachvollziehen, wieso Du eine Schleife baust. Außerdem ist dieser Teil unlogisch:

if (Waggon[i] <= 1 && Waggon[i] >= 5)

Also kleiner-gleich 1 UND größer-gleich 5 ist unmöglich. Entweder das eine oder das andere tritt ein (oder nichts von beidem), aber niemals beides.
Außerdem passiert da ja gar nichts...

    public int holeXPosition()
    {
        for (int i = 0; i < Waggon[i+1]; i++)
        {
            if (Waggon[i] <= 1 && Waggon[i] >= 5)
            {
            //Da passiert ja gar nichts
            }
        }
    }
Woher ich das weiß:Hobby – Langjährige Programmiererfahrung

Es gibt viele Möglichkeiten.

Eine wäre, dass die Ermittlung der xPosition keine Methode des Waggons ist sondern des Zuges. Jeder Waggon für sich muss ja nicht "wissen", wo er sich befindet. Das heißt, du fügst eine Methode Zug.ErmittleWaggonPosition(Waggon) hinzu. Wobei du dir aussuchen kannst, ob du den Waggon-Index oder die Waggon-Referenz übergibst (oder beides überladen).

Woher ich das weiß:Studium / Ausbildung – Datenverarbeitungs-Kfm, Hobby- und Profi-Programmierer

Du iterierst im Waggon in holeXPosition über einen Waggon-Array, der weder in der Methode noch in der Klasse definiert ist.

Im Zug hast du einen Waggon-Array. Stellen die Indizes der dort eingefügten Waggon-Objekte nicht bereits die Positionen dar?

(Ich habe den Code jetzt auch nur quer gelesen.)

Woher ich das weiß:Studium / Ausbildung – Studium (M.Sc., Dr.) und mehrjährige Berufserfahrung