Summieren aller Geschenke vom Typ Geschenk?

Funktionierdochmal

Bekanntes Mitglied
Java:
public class Schlitten extends WeihnachtsObjekt {
   
    private Rentier[] rentiere;
    private Geschenk[] geschenke;


    public Schlitten(Rentier[] rentiere, Geschenk[] geschenke) {
       this.rentiere = rentiere;
       this.geschenke = geschenke;
       
    }

               
    public Geschenk getNaechstesGeschenk () {
        Geschenk[] temp = new Geschenk[this.geschenke.length];
       
        temp[0] = this.geschenke[0];
       
        for(int i = 1; i < temp.length; i++) {
            temp[i] = this.geschenke[i];
        }
        for(int i = 0; i < temp.length; i++) {
            this.geschenke[i] = temp[i];
        }
       
        return temp[0];
    }
    // DIESEN TEIL BEACHTEN BITTE
    public int getGewicht(Geschenk[] geschenke) {
        int gGewicht = 0;
        for(int i = 0; i < this.geschenke.length; i++) {
            gGewicht += this.geschenke[i];
        }
        return gGewicht;
     
    }
Moin Leute, ich habe eine Methode, die ein gesamtes geschenke-array aufsummiert. Jedes mal, wenn ein Geschenk ein Geschenk erstellt wird, wird ihm ein zufälliges Gewicht zugewiesen. Das Problem ist aber, dass meine Methode getGewicht den Fehler aufweist, dass this.geschenke ja den Datentyp "Geschenk" hat und nicht int. Wie kann ich den Inhalt des Arrays aufsummieren, wenn der Datentyp Geschenk ist?
 
`this.geschenke[ i ].getGewicht()`

Außerdem machen viele deiner Methoden keinen Sinn. Warum bekommt denn bitte die Methode zum Berechnen der Gewichte ein Geschenk[] Array als Parameter?? Es hat doch die Geschenke bereits als Instanzvariable.

Du sollst sicherlich die in der Oberklasse deklarierte getGewicht() Methode überschreiben.
 
// DIESEN TEIL BEACHTEN BITTE
public int getGewicht(Geschenk[] geschenke) {
int gGewicht = 0;
for(int i = 0; i < this.geschenke.length; i++) {
gGewicht += this.geschenke[i];
}
return gGewicht;

}
Deine Klasse Geschenk sollte eine getterMethode vom Type int haben.
Java:
gGewicht += this.geschenke[i].getGewicht();
PS. Das Feld geschenke als Übergabeparameter ist überflüssig.
 
Ja stimmt. Mit getGewicht überschreibt er die Methode der Oberklasse
Java:
    public int getGewicht() {
        return 0;
    }

Wenn ich jetzt aber bei der Erstellung eines neuen Geschenks in der Hauptklasse (Weihnachten) einen zufälligen Wert bekomme für das Geschenk, inwiefern betzieht sich das getGewicht dann tatsächlich auf das Gewicht meines Geschenkes? Könnt ihr mir den Zusammenhang etwas erklären? (Frage vor allem an httpdigest gerichtet, der hat mir bei der Aufgabe schon zig male geholfen lol)
 
Implementiere es einfach so, und es wird korrekt funktionieren:
Java:
public int getGewicht() {
  int gGewicht = 0;
  for(int i = 0; i < this.geschenke.length; i++) {
    gGewicht += this.geschenke[i].getGewicht();
  }
  return gGewicht;
}
Grund: Polymorphie bzw. Dynamic dispatch
 
Beim erstellen einer Instanz vom Typ Geschenk, bekommt dieses ein Gewicht zugewiesen.
Wenn Du mehre Geschenke erstellst, dann hat jedes sein individuelles Gewicht. Durch die Methode getGewicht() kann das Gewicht für jedes einzelne Geschenk von außen ermittelt werden.
 
httpdigest ich lese mir deine Antworten immer gründlich und schaue auch in den Folien nach, aber ich stoße immer auf weitere Fehler zu, für die ich einfach keine Lösung finde...
Java:
package de.weihnachten;
import de.weihnachten.Schlitten;

public class Weihnachtsmann extends WeihnachtsObjekt {
    private double futtervorrat;
   
   
    public Weihnachtsmann(double futtervorrat, Schlitten[] schlitten) {
        this.futtervorrat = futtervorrat;
    }
   
    public boolean istFertig() {
        boolean geschenkeAusgeliefert = false;
        if(istLeer() == true) {
           return true;
        } else {
            return false;
        }
    }
Wie hier beispielsweise: Ich möchte von dieser Klasse auf die eben gezeigte Klasse Schlitten zugreifen. Dort gibt es die Methode istLeer(). Wieso findet er jetzt die Methode von der Klasse Schlitten nicht?
 
Falls du den Aufruf `istLeer()` in der Methode `istFertig()` meinst, den du versuchst, auf `this` aufzurufen*, dann ist das ja auch klar. Du machst doch überhaupt gar nichts mit einer Schlitten-Instanz in dieser Methode. Du rufst einfach nur unqualifiziert eine istLeer() Methode auf. Dies es natürlich weder auf `this` (dem Weihnachtsmann) noch als statische Methode gibt.

* = ein unqualifizierter Aufruf einer Methode ist entweder äquivalent zu this.dieAufgerufeneMethode(), falls es sich bei der Methode um eine Instanzmethode handelt, oder es wird eine entsprechend sichtbare statische Methode aufgerufen, wenn es sie gibt

Es sieht so aus, als müsste es noch an sehr vielen Stellen bei dir *click* machen. 🙂 Vielleicht solltest du erstmal ein-zwei Java-Bücher komplett durcharbeiten.
 
Geschenk[] temp = new Geschenk[this.geschenke.length];

temp[0] = this.geschenke[0];

for(int i = 1; i < temp.length; i++) {
temp[i] = this.geschenke[i];
}
for(int i = 0; i < temp.length; i++) {
this.geschenke[i] = temp[i];
}

return temp[0];
}
Die Funktion macht folgendes:
1) kopiert das Array geschenke in das Array temp.
2) kopiert das Array temp in das Array geschenke zurück.
3) gibt das Element temp[0] zurück.
Ist äquivalent zu:
Code:
public Geschenk getNaechstesGeschenk () {
return geschenke[0];
}
 
Java:
public class Weihnachtsmann extends WeihnachtsObjekt {
    private double futtervorrat;
    private Schlitten schlitten;
   
    public Weihnachtsmann(double futtervorrat, Schlitten schlitten) {
        this.futtervorrat = futtervorrat;
        this.schlitten = schlitten;
    }
   
    public boolean istFertig() {
        boolean geschenkeAusgeliefert = false;
        if(this.schlitten.istLeer() == true) {
           return true;
        } else {
            return geschenkeAusgeliefert;
        }
    }
Vllt hat es jetzt ein bisschen ge*clickt* bei mir?
 
Würde schonmal funktionieren, ist aber noch unnötig umständlich:
Java:
public boolean istFertig() {
  boolean geschenkeAusgeliefert = false;
  if (this.schlitten.istLeer() == true) {
    return true;
  } else {
    return geschenkeAusgeliefert;
  }
}
`== true` ist IMMER unnötig:
Java:
public boolean istFertig() {
  boolean geschenkeAusgeliefert = false;
  if (this.schlitten.istLeer()) {
    return true;
  } else {
    return geschenkeAusgeliefert;
  }
}
Zuweisung zu Variable geschenkeAusgeliefert ist unnötig:
Java:
public boolean istFertig() {
  if (this.schlitten.istLeer()) {
    return true;
  } else {
    return false;
  }
}
Ein `if (bedingung) return true; else return false;` kann zu `return bedingung;` vereinfacht werden:
Java:
public boolean istFertig() {
  return this.schlitten.istLeer();
}
 

Zurück
Oben