Objektorientierte Programmierung

queenlui

Mitglied
Hallo liebe Leute,

dies ist mein erster Beitrag hier, in diesem Forum. Ich studiere Informatik im zweiten Semester und wir müssen immer mal was programmieren, auf das es Punkte gibt.
Diesmal ist es ein Burger Konfigurator, unser Problem liegt hauptsächlich darin, die Burgerklasse zu Programmieren, in der mit Schleifen, Methoden und Arrays, gearbeitet wird. Leider stehen wir einfach dermaßen auf dem Schlauch und wissen nicht, wie wir ansätzen sollen.

In der Burgerklasse müssen die einzelnen Preise der Zutaten verrechnet werden, die Zubereitung und die Höhe müssen überschrieben werden. Hättet ihr Tipps wie man dieses Problem angehen kann? Wir haben Klassen für die einzelnen Zutaten erstellt und eine Zutatenklasse, in der die einzelnen Klassen erben. Die Methoden in den Klassen haben wir schon geschrieben, uns fehlt, wie gesagt, hauptsächlich nur noch die Burgerklasse.

Über jegliche Tipps würd ich mich sehr freuen, vielen Dank schonmal!
 
In der Burgerklasse müssen die einzelnen Preise der Zutaten verrechnet werden, die Zubereitung und die Höhe müssen überschrieben werden.

Heißt das in der Burger soll Zubereitung und Höhe überschrieben werden oder bezieht sich das auf eine Zutat?

Wir haben Klassen für die einzelnen Zutaten erstellt und eine Zutatenklasse, in der die einzelnen Klassen erben.

Das Klingt doch schon mal gut. Wie ist euer Ansatz? Für mich wäre spontan ein Burger nichts anderes als eine Liste von Zutaten wobei ein Burgerbrötchen immer Pflicht wäreö Dann kann über diese Zutaten iteriert werden für Gewicht, Höhe, Kalorien, Zubereitungsschritte, zutatenpreise und was weiß ich.

Besser ist es in den meisten Fällen Interfaces zu verwenden, anstatt zu erben. Ihr könnte dann auch weitere Interfaces ergänzen, wenn ihr z.B. zusätzlich eine Soße unterscheiden wollt, welche streichbar ist, oder Zutaten, welche erhitzt werden müssen in der Zubereitung.
 
Vielen Dank schonmal für deine Antwort!

Die Zubereitung und die Höhe des Burgers selbst, soll überschrieben werden können, da, die bestellten Burger, nicht alle die selbe Höhe haben. Sprich, jede Zutat hat eine eigene bestimmte Höhe.
Wir haben für jede Zutat (Brötchen, Bratlinge, Gemüse, Salat und Saucen)
Gemüse als Beispiel:
Java:
public class Gemuese extends Zutaten{
      
       int scheibenAnzahl;
       int scheibenDicke; //In mm
      

       public Gemuese(float preis, int nummer, String name, boolean klassisch, boolean vegan, boolean vegetarisch, int scheibenAnzahl, int scheibenDicke) {
           super(preis, nummer, name, klassisch, vegan, vegetarisch);
           this.scheibenAnzahl = scheibenAnzahl;
           this.scheibenDicke = scheibenDicke;
          
          
       }
und dann haben wir noch eine Klasse "Zutaten", wo die von erben.
Die Klasse sieht bisher so aus:
Java:
public class Zutaten {
   float preis;
   int nummer;
   String name;
   boolean klassisch;
   boolean vegan;
   boolean vegetarisch;
  

   public Zutaten(float preis, int nummer, String name, boolean klassich, boolean vegan, boolean vegetarisch) {
       this.preis = preis;
       this.nummer = nummer;
       this.name = name;
       this.klassisch = klassich;
       this.vegan = vegan;
       this.vegetarisch = vegetarisch;
   }
Ich weiß nicht, wie das funktioniert, haben zur Zeit das Thema Vererbung, wo diese Aufgabe drauf aufbaut..
Ebenfalls haben wir eine Anwendungsklasse, in der die Arrays drin stehen:
Java:
public class Anwendung {

   public static void main(String[] args) {

       String command[] = new String[2];

       String line;

       Zutaten[] menuearray = new Zutaten[18];

       menuearray[0] = new Broetchen(0.85f, 10, "Hamburger (Standart)", true, false, false, 90, 27);
       menuearray[1] = new Broetchen(0.95f, 11, "Hamburger Sesam", true, false, false, 90, 28);
       menuearray[2] = new Broetchen(0.55f, 12, "Vegan-Broetchen", false, true, false, 240, 34);
       menuearray[3] = new Broetchen(0.45f, 13, "Ciabatta", false, false, true, 330, 41);
ist jetzt nur ein Teil davon.

In der Aufgabenstellung, für die Burgerklasse steht:
Bei der Ausgabe, eines Burgers sollen folgende Informationen ausgegeben werden:
Burgername, Zutaten-Liste, Preis, Höhe, Zutateninformationen: klassisch, vegan, vegetarisch, Geschmacksrichtung: scharf/süß/salzig oder klassich.
Methoden müssen so umgesetzt werden, dass man den Namen des Burgers speichern kann (Nutzer sucht sich selbst einen Namen aus), die Zutaten zubereitet werden, den Burger mit ausgewählten Zutaten belegen, berechnete Zeit für die Zubereitung des Burgers bestimmen und die Höhe des Burgers berechnen. Ein Burger darf nur aus genau einem Brötchen bestehen und aus maximal 8 weiteren auszuwählenden Zutaten.

Sind einfach am verzweifeln. 🙁
 
Zuletzt bearbeitet von einem Moderator:
Was unterscheidet denn die Klasse Gemüse von der Klasse Sauce? Wozu braucht es überhaupt abgeleitete Klassen von Zutat?
Java:
Zutat salat = new Zutat("Salat", usw.);
Zutat gurke = new Zutat("Gurke", usw.);

Wenn alle Zutaten eine Dicke haben, warum ist diese dann nicht in der Klasse Zutaten enthalten (die besser "Zutat" heißen sollte, weil es sich um eine und nicht um mehrere Zutaten handelt)?

Dann würde z.B. so etwas gehen:
Java:
Zutat[] zutaten = new Zutat[8];
//...
zutaten[0] = new Zutat("Gurke", usw.);
//...
int hoehe = 0;
for (Zutat zutat : zutaten) {
   hoehe += zutat.dicke;
}
 
Zuletzt bearbeitet:
Die Klasse Gemüse unterscheidet sich beispielsweise von der Scheibenanzahl und Scheibendicke. Die Klasse Sauce beinhaltet die Menge in ml und den Schmack, Bratlinge bspw unterscheiden sich von der Bratzeit und Brötchen von der Backzeit. Die Variablen, die alle gemeinsam haben, sprich, Bestellnummer, preis, etc, befinden sich in der Klasse "Zutaten".
 
Wenn man sich die Aufgabe anschaut, dann geht es offenbar darum in einer Klasse "Burger" eine Liste von Zutaten zu erstellen, über diese zu iterieren und Höhe, Zubereitungszeit, usw. zu berechnen. Dazu müssen aber alle in der Liste gespeicherten Zutaten über die gleichen Zugriffsmöglichkeiten auf die Werte dazu verfügen (also mindestens für die Zeit und für die Dicke).
Das können Methoden wie "gibDicke()" (um mal im Deutschen zu bleiben) oder wie in deinem Fall Variablen die von außen zugreifbar sind. Es gilt die Regel, dass in der objektorientierten Programmierung die Klassen nur benötigte Informationen nach außen geben sollten, alles weitere sollte verborgen (= private) sein.
Bei einer Zutat wie "Sauce" liefert die Methode "gibDicke()" dann einfach Null zurück.
 
Hast du vielleicht einen Plan davon, wie man das Problem am Besten angehen könnte?
Eigentlich ist ja alles ziemlich gut beschrieben und wie es grundsätzlich geht steht hier schon etwas weiter oben. Die Basisklasse Zutat hat ja eine Methode "berechneHöhe". Die Berechnung der Gesamhöhe ist also:
Java:
int hoehe = 0;
for (Zutat zutat : zutaten) {
   hoehe += zutat.berechneHoehe();
}

In der Basisklasse solltet ihr bei "berechneHoehe()" Null zurückgeben und die Methode in den entsprechenden Unterklassen überschreiben. Zutatenarten, wie Sauce, verwenden weiterhin die Methode der Basisklasse und werden mit dem Wert Null verrechnet.

Beachte noch alle Hinweise: z.B. Geheimnisprinzip => die Variablen sollten alle mit "private" gekennzeichnet werden und *nur* bei Bedarf über getter/setter zugreifbar gemacht werden.
 
Muss ich auch in dem Konstruktor
Bsp:
public Bratlinge(float preis, int nummer, String name, boolean klassich, boolean vegan, boolean vegetarisch, int bratzeit, int hoehe) {
super(preis, nummer, name, klassich, vegan, vegetarisch);
this.bratzeit = bratzeit;
this.hoehe = hoehe;
vor den Variablen private schreiben, also:
public Bratlinge(private float preis, private int nummer, private String name, private boolean klassich,private boolean vegan, private boolean vegetarisch, private int bratzeit, private int hoehe) {
super(preis, nummer, name, klassich, vegan, vegetarisch);
this.bratzeit = bratzeit;
this.hoehe = hoehe;

oder nur außerhalb des Kontruktor?
 
Ok, gut.
Letzte Frage noch:
Wenn der Nutzer eine Bestellnummer eingibt, muss diese mit einem return gespeichert und in dem Array gesucht werden, wie geht man da vor? Mit einer Schleife?
 
muss diese mit einem return gespeichert und in dem Array gesucht werden, wie geht man da vor? Mit einer Schleife?
Ja. Durch das Array gehen und jedes Element anschauen, bis eines davon die richtige Bestellnummer hat. Da die Bestellnummer privat ist, brauchst du dafür schon mal einen getter "getBestellnummer()".

Es gäbe zwar besser geeignete Strukturen, wie Map, aber ich gehe mal davon aus, dass ihr das nicht verwenden sollt.
 
Okey, gut, vielen Dank!
Nein, damit sollen wir nicht arbeiten..

Ich hab das mit der hoehe mal eingefügt, mir wird angezeigt, ich solle "private static final String Zutaten = null;" einfügen, jedoch wird nachdem weiterhin alles rot.

Tut mir wirklich Leid, so nervige Fragen stellen zu müssen, jedoch finde ich im Internet bezüglich dessen so gut wie nichts und unsere Zeit drängt. :/
 
@queenlui

Kannst du mir das (Eclipse) Projekt senden, wenn du fertig bist?
Das mit den Burgern sieht interessant aus, ich würde gerne aus einer möglichen Lösung lernen!

Und verwende bitte, wenn du Code postest, das mit der Einfügen->Code Methode,
liest sich viel besser.
 
@queenlui
In etwa so?
Java:
public class SubWay
{

  
    public static void main(String[] args)
    {
        Caffee blackToMuchSugar = new Caffee(new Milk(0), new Sugar(7));
        System.out.println(blackToMuchSugar.getEuro().getValue());
      
        Caffee justBlack = new Caffee(new Milk(0), new Sugar(0));
        System.out.println(justBlack.getEuro().getValue());
      
        Caffee milkAndSugar = new Caffee(new Milk(3), new Sugar(2));
        System.out.println(milkAndSugar.getEuro().getValue());
    }
  
}
/** Konsolenausgabe */
2.41
1.5
2.06

edit: ich habe mir gerade den Flyer angesehen und auf den ersten Blick sieht es für mich so aus:

McObject (double burgerHeight, VarietyOfBurger vob, boolean spice)
VarietyOfBurger (Klassisch, Vegetarisch, Vegan)
Klassisch: ProduktKlassisch
Vegetarisch: ProduktVegetarisch
Vegan: Staub
Scharf oder auch nicht

Also würde ich mir a) paar Pakete erstellen und diese als feste Bestandteile der Karte anbieten und b) ein Sonderding anbieten.

Ebenso sieht es für mich aus, als müsstest du alle Zutaten usw als eigenständige Klasse anbieten, aber eventuell irre ich mich hier.
 
Zuletzt bearbeitet:
Ich finde die PDF ja toll x) Hat er sich richtig ausgetobt der gute Professor. Ich persönlich finde die Aufgabe schon umfangreich (aber auch gut) für ein Stegreifprojekt als Anfänger, aber wenn ihr im Team arbeitet bekommt ihr das schon hin.

Ich finde aber eigentlich, dass alles prima beschrieben ist. Geht doch von vorne nach hinten durch.

Beispiel Controller:
‣ Der Bestellprozess soll über die Tastatureingabe erfolgen:
--> Eingabehandling, ich schätze das bedarf nicht viel Erklärung

‣ „menu“ -> Anzeige der gesamten Karte
--> ihr braucht also eine Methode showMenu(), welche alle Zutaten aus der Zutatenliste anzeigt. Die Zutatenliste ist im Controller bekannt.

‣ „zutat“ Bestelltnummer -> Zutat
--> ihr braucht also eine Methode findIngredientByOrdernumber(int number):Ingredient und eine Methode addIngredient(Ingredient) welche die Zutat zum Burger im Bearbeitungsmodus hinzugefügt wird. Das sollte ein eigenständiges Objekt sein, sagen wir "editBurger"

‣ „meine burger“ -> Anzeige der aktuellen Bestellung
--> Ihr braucht also eine Methode showBurger() welche alle Burger aus dem Array der Größe 10 ausgibt

‣ „ok“ -> Abschluss des aktuell zusammengestellten Burgers
--> ihr braucht also eine Methode finishBurger(), welcher den editBurger in das BurgerArray ergänzt. editBurger wird wieder null

‣ „bestellen“ -> Bestellung abschließen
--> ihr braucht also eine Methode order(), welche intern folgendes tut...
hier werden dann die bestellten Burger zubereitet, der Gesamtpreis und die Gesamtzubereitungszeit ausgegebenen
makeBurger() ... getTotalPrice() ... getTotalPreparationTime()


Und natürlich überall die geforderten Ausgaben
 

Neue Themen


Zurück
Oben