# Problem Abstrakte Klassen, vererbung



## djutt (1. Feb 2015)

Hallo, das ist jetzt mein erster Beitrag in einem Forum überhaupt und schlimm genug, dass ich in diesem direkt nach Hilfe fragen muss, statt helfen zu können. Ich hoffe jemand kann und mag mir bei meinem Problem helfen:

Ich muss folgendes Programm zum laufen bekommen


```
public class Kuehlschrank {
  protected Lebensmittel[] kuehlschrank;
    protected int fuellstand;
    public Kuehlschrank(int size) {
        kuehlschrank = new Lebensmittel[size];
        fuellstand = 0;
  }
    public void einkaufen() {
        kuehlschrank[fuellstand++] = (new Mate("Club Mate"));
        kuehlschrank[fuellstand++] = (new Brot(1, 750));
        kuehlschrank[fuellstand++] = (new Wasser("Sprudel", 330));
        kuehlschrank[fuellstand++] = (new Mate("Flora Power"));
        kuehlschrank[fuellstand++] = (new Brot(3, 1000));
        kuehlschrank[fuellstand++] = (new Wurst("Soja Spezial", 100));
    kuehlschrank[fuellstand++] = (new Wasser("Still", 2000));
    }
    public void auflisten() {
        for (int i = 0; i < fuellstand; i++) {
          System.out.println(kuehlschrank[i].status());
    }
  }
  public void verbrauchen() {
    for (int i = 0; i < fuellstand; i++) {
      if (kuehlschrank[i].essen()) {
        System.out.println("Essen: " + kuehlschrank[i].status());
      }
      if (kuehlschrank[i].trinken()) {
        System.out.println("Trinken: " + kuehlschrank[i].status());
      }
    }
  }
  public static void main(String argv[]) {
    Kuehlschrank kschrank = new Kuehlschrank(10);
    kschrank.einkaufen();
    kschrank.auflisten();
    kschrank.verbrauchen();
  }
}



public abstract class Lebensmittel {
  protected String name;
  protected int menge;// in Milliliter bzw. Gramm
  public Lebensmittel(String name, int menge) {
    this.name = name;
    this.menge = menge;
  }
  public abstract boolean essen();
  public abstract boolean trinken();
  public abstract String status();
}
```

Diese beiden Klassen sind mir vorgegeben und mein Problem ist, diese darf ich nicht verändern.
Folgende müssen damit laufen:


```
public class Getraenk extends Lebensmittel 
{ 
   
public Getraenk (String name, int menge) 
   { 
      super (name, menge); 
   }

   public boolean essen() 
   { 
      return false; 
   }

   public boolean trinken() 
   { 
      return true; 
     
   }

   public String status() 
   {  
      return ("In diesen Kuehlschrank passen nur die Getraenke Wasser und Mate ;)");
   } 
}  

public class Wasser extends Getraenk 
{ 
   public Wasser (String name, int menge) 
   { 
      super (name, menge); 
   }

   public String status() 
   {  
      return "Wasser: " + "\""+name+"\"" + "\nDie Flasche beinhaltet " + ((float) menge / 1000) + " Liter";
   } 
} 


public class Mate extends Getraenk 
{ 
	   public Mate (String name, int menge)
	   {
		   super(name,menge);
	   }
	   
	   
	   public String status() 
	   { 
	   return "Mate: " + "\""+name+"\"" + "\nDie Flasche beinhaltet 0.5 Liter";
	   } 
	}
```

Die Speisen habe ich einfach weg gelassen, da das Prinzip das selbe sein dürfte.
Also unter der Methode einkaufen lässt sich Wasser problemlos einlesen, da (String name, int menge) passt. 
Wenn ich Mate einlesen soll ist mir aber nur ein String gegeben, welches nicht in die selbe Methode passt, da ihm dann ein int fehlt.

Meine erste Idee war es in die Klasse Lebensmittel eine neue Methode Lebensmittel(String name) zu schreiben, bis ich bemerkt habe, dass ich diese Klasse nicht verändern darf und es somit noch anders zu lösen sein muss.
Kann mir vielleicht jemand den richtigen Hinweis geben? Sonderlich schwer scheint die Aufgabe nicht zu sein ich habe einfach ein riesen Brett vor'm Kopf =( Und verzeiht mir bitte den langen Post.


----------



## Agaton Sax (1. Feb 2015)

```
public class Mate extends Getraenk {
    public Mate (String name) {
        super(name, 500);
    }
    ...
}
```


----------



## djutt (1. Feb 2015)

Oh wow, vielen Dank, das war ja simpel 
Wie sähe es denn nun aus in dem Fall Brot (wo ich ein int für den Brottyp,und ein int für die menge) einlese.
Dafür bräuchte ich (vermute ich) eine Methode, welche 2 int Werte "liest" (statt string,int), aber wo soll diese dann rein? Wäre folgender Ansatz wenigstens teilweise korrekt?


```
public class Speise extends Lebensmittel 
	{ 
	
	   public Speise (String name, int menge) 
	   { 
	      super (name, menge);
	   }
	   public Speise (int name, int menge)
	   {
		   super (name,menge);
	   }
	   
	   
	   public boolean essen() 
	   { 
	      return true; 
	   }

	   public boolean trinken() 
	   { 
	      return false; 
	   }

	   public String status() 
	   { 
		return ("In diesen Kuehlschrank passen nur die Speisen Brot und Wurst ;)"); 
	   } 
	}
```

Eclipse zufolge fehlt mir dann immer noch eine Methode mit den Werten (int,int) in der Klasse Lebensmittel aber kann ich das noch umgehen?


----------



## Agaton Sax (1. Feb 2015)

Umwandlung von int -> String geht mit: String.valueOf(int)

Einen eigenen Konstruktor in der Speise-Klasse musst du aber nicht definieren. Es reicht, die Umwandlung im Konstruktor der Brot-Klasse vorzunehmen:

```
public Brot(int whatever, int menge) {
   super(String.valueOf(whatever), menge);
}
```
Was soll die erste Zahl beim Brot eigentlich darstellen?


----------



## djutt (1. Feb 2015)

Ok ich kann gar nicht genug danken, da habe ich Java wohl etwas unterschätzt.
Die erste Zahl soll für einen bestimmten Brottypen stehen, heißt 0=Weißbrot, 1=Schwarzbrot, usw.
Soll uns die Aufgabe etwas erschweren und wirklich vielen dank, eine "umwandlung" in einer super Methode vorzunehmen kam mir überhaupt nicht in den Sinn.

Dann habe ich die schwierigste Hürde nun hinter mir und schaffe hoffentlich nun essen() und trinken() zu etwas sinnvollem zu machen =)


----------



## Agaton Sax (1. Feb 2015)

Bitte. Eine kleine Ergänzung zur Begriffsgebung: Das sind Konstruktoren und keine Methoden.


----------

