# Java Containerklasse



## WalterSobchak (12. Jan 2012)

Hallo, 

ich habe ein Problem bei meiner Übung. Und zwar bei einer Containerklasse. 

Hier die Übung: Klick mich

Und zwar bei der Klasse Warenlager. Ich habe absolut keine Ahnung was ich dort machen soll. 
Alle Klassen davor habe ich schon geschrieben. 


```
import utilities.*;


class Haushaltsgerät extends Ware{
  private double anschlussLeistung;
  private double gewicht;
  
  public Haushaltsgerät(String bezeichnung, double preis, double leistung, double gewicht){
    super(bezeichnung, preis);
    this.anschlussLeistung = leistung;
    this.gewicht = gewicht;
  }
  
  public String toString(){
    return  "Anschlussleistung: " + this.anschlussLeistung + "\n" + "Gewicht: " + this.gewicht + "\n";
  }
}
```


```
import utilities.*;


class Milchprodukt extends Ware{
  private Datum verfallsDatum;
  private double maxLagerTemperatur;
  
  public Milchprodukt(String bezeichnung, double preis, Datum mhd, double maxT){
    super(bezeichnung, preis);
    this.verfallsDatum = mhd;
    this.maxLagerTemperatur = maxT;
  }
  
  public String toString(){
    return "Mindeshaltbarkeitsdatum: " + this.verfallsDatum + "\n" + "Maximale Lagertemperatur: " + this.maxLagerTemperatur + "\n";
  }
}
```


```
import utilities.*;


class Ware{
  private static int aktuelleNummer = 0;
  private int nummer;
  private String bezeichnung;
  private double preis;
  private int anzahl = 0;
  
  public Ware(String bezeichnung, double preis){
    this.bezeichnung = bezeichnung;
    this.preis = preis;
  }
  
  public int getNummer(){
    return this.nummer;
  }
  
  public String getBezeichnung(){
    return this.bezeichnung;
  }
  
  public double getPreis(){
    return this.preis;
  }
  
  public int getAnzahl(){
    return this.anzahl;
  }
  
  public void einlagern(int anzahl){
    this.anzahl += anzahl;
  }
  
  public int entnehmen(int anzahl){
    if(this.anzahl >= anzahl)
      this.anzahl -= anzahl;
    else
      System.out.println("Warnung: Es sind nicht genügend Güter mehr auf Lager");
    
    return this.anzahl;
  }
  
  public String toString(){
    return "Aktuelle Nummer: " + this.aktuelleNummer + "\n" + "Numemr: " + this.nummer + "\n" + "Artikelbezeichnung: " + this.bezeichnung + "\n" + "Preis: " + this.preis + "\n" + "Anzahl: " + this.anzahl + "\n";
  }
  
  public void print(){
    System.out.println("Artikelnummer: " + this.nummer);
    System.out.println("Artikelbezeichnung: " + this.bezeichnung);
    System.out.println("Menge: " + this.anzahl);
  }
  
  public boolean istWareOk(){
    return true;
  }
}
```

Aber wie gesagt, bei der Containerklasse blicke ich absolut nicht durch. Das kann aber auch daran liegen, weil ich auch bei den Feldern noch nicht so ganz durchblicke. Vielleicht kann mir ja jemand von euch anhand dieses Beispiels auch noch Arrays erklären, weil ich sie beim Openbook nicht verstehe. 

Schonmal danke im Vorraus. 


mfg


----------



## vanny (12. Jan 2012)

Naja WarneLager benötigt schonmal ein Array, das über den Konstruktor in der richtigen Größe erstellt wird, und überall null als Wert hat.(sollte bei einem komplexen Datentyp wie "Waren" wohl default so sein)

Dann benötigst du methoden, die die Waren da rein packen und wieder entnehmen und ggF. eine Warnung ausgibt.

Der Rest sollte dann leicht machbar sein.
Gruß Vanny

EDIT://

```
public class WarenLager {
	
	private Ware[] waren;
	
	public WarenLager(int kapazitaet){
		waren = new Ware[kapazitaet];
	}
	
	//So könnte man testen ob noch Platz im Lager ist
	private boolean istVoll(){
		boolean voll = true;
		for(int i=0;i<waren.length;i++){
			if(waren[i] == null){
				voll = false;
			}
		}
		return voll;
	}
	
	//Dann noch die rein- und rausMethoden usw.

}
```


----------



## WalterSobchak (13. Jan 2012)

Hallo, 

Hm...Ok danke schonmal für den Anfang. Aber ich verstehen einfach nicht, wie ich die Methoden 
	
	
	
	





```
einlagern()
```
 und 
	
	
	
	





```
entnehmen()
```
 schreiben soll. Ich weiß einfach nicht wie man sowas mit Arrays implementiert. Allein schon solche Sätze, wie diese hier: 





> Das Feld wird beginnend vom Index 0 ab gefüllt. Freie Feldelemente enthalten den Wert null.


 irritieren mich sehr, weil ich einfach keine Ahnung habe wie ich es machen soll. 

mfg


----------



## jgh (13. Jan 2012)

die Methoden einlagern, bzw. entnehmen müssen einfach den Wert der Variable anzahl erhöhen, bzw. verringern.


```
public class Artikel{
...
private int anzahl;

	public void einlagern(int anzahl) {
		this.anzahl = this.anzahl + anzahl;
	}

	public void entnehmen(int anzahl) {
		if (this.anzahl >= anzahl) {
			this.anzahl = this.anzahl - anzahl;
		} else {
			System.out
					.println("Es sind zu wenig Artikel vorhanden:\nVorhanden: "
							+ this.anzahl + " < " + anzahl);
		}

	}
}
```

Dann fehlt m.E. noch:

_Eine Klassenvariable aktuelleNummer wird zum eindeutigen Durchnummerieren aller
Artikeltypen verwendet._

also musst du imho im Konstruktor des Artikels noch diese Klassenvariable inkrementieren.
[java=11]  public Ware(String bezeichnung, double preis){
    aktuelleNummer++;
    this.bezeichnung = bezeichnung;
    this.preis = preis;
  }[/code]

Desweiteren soll die Methode 
	
	
	
	





```
istWareOk()
```
 in den entsprechenden Klassen überschrieben werden...ihr verwendet ein Datentyp 
	
	
	
	





```
Datum
```
? dann entsprechend ändern...


```
public boolean istWareOk() {
		if (verfallsDatum.after(new Date())) {
			return false;
		} else {
			return true;
		}
	}
  }
```

na ja...noch so einige Sachen sind da zu machen...hoffe das hilft dir ein wenig

edit:
_Die Methode toString() gibt als Funktionswert eine Zeichenkette zurück, die *alle*
Attributwerte enthält._

=> deine toString() -Methode soll auch die Attribute der Elternklasse mitausgeben, also sowas bspw

```
public String toString() {
		return "Mindeshaltbarkeitsdatum: " + this.verfallsDatum + "\n"
				+ "Maximale Lagertemperatur: " + this.maxLagerTemperatur + "\n"
				+ "Anzahl: " + super.getAnzahl() + "\nBezeichnung: "
				+ super.getBezeichnung();// usw
	}
  }
```


----------



## WalterSobchak (13. Jan 2012)

Hallo, 



> die Methoden einlagern, bzw. entnehmen müssen einfach den Wert der Variable anzahl erhöhen, bzw. verringern.



Diese Methoden hatte ich auch schon geschrieben. Auch fast identisch zu deiner Lösung. 

Ich meinte die Methoden 
	
	
	
	





```
einlagern()
```
 und 
	
	
	
	





```
entnehmen()
```
 in der Klasse Warenlager. Bei denen blicke ich nicht durch. 

Aber danke für die anderen Korrekturen. Die haben mir schonmal geholfen, Fehler auszubessern.


----------



## jgh (13. Jan 2012)

irgendwie so würde ich das machen...so auf die schnelle:

wobei mir dann natürlich aufgefallen ist, dass deine Waren eigentlich Artikel heißen müssten...


```
public void einlagern(Ware w, int anzahl) {
		for (int i = 0; i < waren.length; i++) {
			if (waren[i] == null) {
				waren[i] = w;
				w.einlagern(anzahl);
				System.out
						.println("Ware oder Artikel erfolgreich eingelagert an Position "
								+ i);
				return;
			}
		}
		System.out
				.println("Waren konnte nicht eingelagert werden, Warenlager voll");
	}
       public void entnehmen(Ware w, int anzahl) {
		for (int i = 0; i < waren.length; i++) {
			if (waren[i] == w) {
				waren[i].entnehmen(anzahl);

			}
		}
	}
```


----------



## WalterSobchak (13. Jan 2012)

> wobei mir dann natürlich aufgefallen ist, dass deine Waren eigentlich Artikel heißen müssten...



Achja stimmt^^

Na gut das werde ich dann mal versuchen. Danke für deine Hilfe. 

Kann geschlossen werden.


----------

