Klassen Modellierung einer Kneipe

babuschka

Top Contributor
Hallo, folgende (leider etwas längliche) Aufgabe ist gestellt:



In den folgenden Aufgaben geht es darum, das Nachtleben einer Kneipe zu simulieren. Wie
bei einer echten Kneipe können Gäste eine Kneipe betreten, verlassen, Getränke bestellen etc.
Natürlich sind nicht alle Gäste gleich, einige von ihnen können sich bei erhöhtem Alkoholkonsum
nicht benehmen und werden aus der Kneipe geworfen. Andere Gäste wiederum sind berühmt und
werden als VIP's behandelt. Neben Gästen gibt es aber auch Kellner, welche die Gäste bedienen.
Und was darf jeder Kneipe nicht fehlen? Genau: eine Live-Band. Diese ist also ebenfalls in der
Kneipe vertreten.

Aufgabe 1

Area
Alle Kneipen sind gleich aufgebaut. Es gibt eine Bühne, eine Theke und eine Tür.
Natürlich sind einige Pläatze begehrter als andere. Gäste bevorzugen die Bühne, mit der Theke
geben sie sich auch noch zufrieden. Am unbeliebtesten ist der Bereich um die Tür.
Schreibt eine Klasse Area, die solch einen Bereich darstellt. Jeder Bereich zeichnet sich dadurch
aus, dass eine bestimmte Anzahl an Sitzplätzen vorhanden ist. Außerdem hat eine Area
einen Namen (also Bühne etc.) und eine Liste mit Gästen. Natürlich darf die Größe der Liste
nicht die Anzahl der Sitzplätze überschreiten.

Bar
Entwickelt weiterhin eine Klasse Bar, die jeweils die drei oben genannten Bereiche beinhaltet.
Beim Erstellen eines Objektes der Klasse Bar (also im Konstruktor) wird übergeben,
welchem Bereich wie viele Sitzplätze zugesichert werden. Diese Anzahl kann sich nach dem Konstruktoraufruf
nicht mehr verändern (Begründet hier eure Vorgehensweise). Zusatzlich ist die
Anzahl der Personen einer Kneipe beschränkt. Es kann nur so viele Gäste geben, wie es auch
Sitzplätze gibt. Die maximale Anzahl der Kellner entspricht der Anzahl der Sitzplätze durch
fünf, mindestens jedoch 3. Live-Bands mit mehr als fünf Musikern passen nicht auf die Bühne.
Um eine gute Trennung zu ermöglichen, enthalt jede Bar zwei Listen. Zum Einen eine für die
Kellner, zum Anderen eine fur die Musiker.

Person
Jeder der eine Kneipe besucht (ob nun als Gast, Kellner oder Musiker) ist eine Person.
Alle Personen haben einen Namen (welcher im Konstruktor übergeben wird) und können eine
Kneipe betreten und wieder verlassen (Methode enter(Bar bar) und leave()). Jede Person weiß,
in welcher Kneipe sie sich befindet, hat also ein Attribut von Typ Bar. Ist eine Person in keiner
Kneipe, so ist dieses Attribut = null. Weiterhin spezifiziert eine abstrakte Methode doSomething().
Diese wird von der konkreten Person (also dem Gast, dem Kellner etc.) implementiert
und stellt eine Aktion innerhalb der Kneipe dar.
Immer wenn etwas passiert (ein Gast bestellt z.B. ein Getränk), soll eine Ausgabe auf der Konsole
erscheinen mit Namen der Person und der gerade ausgeübten Tätigkeit.
Ziel ist es, am Ende anhand der Ausgaben nachvollziehen zu konnen, was in der Kneipe so
passiert.

Guest
Ein Gast ist eine Person. Wenn er die Kneipe betritt, versucht er zunächst einen Platz
bei der Bühne zu bekommen. Sind dort schon alle Sitzplätze belegt, so versucht er es weiter bei
der Theke. Ist dort ebenfalls alles besetzt, so versucht er es bei der Tür. Ist gar kein Platz mehr
frei, so muss der Gast leider draußen bleiben. Wurde ein freier Platz gefunden, so trägt sich der
Gast in die Liste des jeweilig gewählten Bereichs ein. Ein Gast kann, sofern er in einer Kneipe ist,
sich entschließen diese wieder zu verlassen (wird in der Methode doSomething() ausgeführt). Die
Auswahl, ob er dies tut oder nicht, findet zufällig statt. Zufallswerte lassen sich mit der Methode
random der Klasse Math erzeugen (also Math.random()). Verläasst ein Gast eine Kneipe, so muss
er aus der jeweiligen Liste entfernt werden

Musician
Ein Musiker ist eine Person. Er besitzt immer ein Instrument, welches im Konstruktor
übergeben wird. Beim Aufruf der Methode doSomething() gibt er an, welches Instrument er
gerade spielt. Beim Betreten der Kneipe wird der Musiker in die Liste für die Musiker eingetragen.

Main
Die Klasse Main erzeugt eine Kneipe und füllt diese mit Personen. Damit etwas in der Kneipe passieren kann,
gibt es eine Schleife, die für jede Person doSomething() aufruft. Zur Umsetzung dieser Schleife
sollten alle Referenzen der erzeugten Personen in dieser Klasse gespeichert sein.
In der bereits vorgegebenen Klasse Main befindet sich eine statische Methode waitFor(long millis).
Diese Methode sorgt dafür, dass das Programm eine bestimmte Zeit wartet, bevor es weiter
arbeitet (Angaben in Millisekunden). Verwendet diese Methode, um die Konsolenausgaben etwas
zu verzögern.


Aufgabe 2 sowie Aufgabe 3 lasse ich erstmal weg. Ich denke, wenn ich Aufgabe 1 hinbekommen habe, bekomme ich auch den Rest hin.




Hier sind meine bisherigen Ideen, die sicherlich alles andere als gut sind.
Im Moment weiß ich jedoch nichts Besseres und lasse mir hier lieber helfen!

Meine Idee zur Klasse Area:

Code:
import java.util.List;
import java.util.ArrayList;

public class Area{

int size;
String name;
List<Guest> guests= new ArrayList<Guest>;


// Konstruktor, den ich glaube ich, für die Klasse Bar brauche
public Area(int size){
   this.size=size;
}

//Methoden, die man glaube ich später für die Klasse Guest braucht

public boolean addGuest(Guest g){

boolean untergekommen=false;
if(guests.size()<size){
   guests.add(g);
   untergekommen=true;
 }

return untergekommen;
}

public void deleteGuest(Guest g){
guests.remove(g);
}

}

Meine Idee zur Klasse Bar:

Code:
public class Bar{

Area Stage;
Area Counter;
Area Door;
List<Waiter> waiter=new ArrayList<Waiter>;
List<Musician> musicians=new ArrayList<Musician>;
int maximumNumberOfWaiter;
int maximumNumberOfMusicians;
double cashBox;

public Bar(int sizeOfStage, int sizeOfCounter, int sizeOfDoor){

Stage= new Area(sizeOfStage);
Counter= new Area(sizeOfCounter);
Door= new Area(sizeOfDoor);
}

public void addWaiter(Waiter w){

  if( (waiter.size()<3) || (3<=waiter.size()<(sizeOfStage+sizeOfCounter+sizeOfDoor)/5) )
  {   
     waiter.add(w);
  }

public void deleteWaiter(Waiter w){
   waiter.remove(w);
}

public void addMusician(Musician m){
  if(musicians.size()<5){
   musicians.add(m);}

public void deleteMusician(Musician m){
   musicians.remove(m);
}

}

Meine Idee zur Klasse Person:

Code:
public class Person{
String name;
Bar bar=0;

public Person(String name){
this.name=name;
}

public void enter(Bar bar){
this.bar=bar;
}

public void leave(){
 bar=0;
}

abstract public void doSomething();
}


Meine (fragwürdige) Idee zur Klasse Guest:

Code:
public class Guest extends Person{

Area area;

public void doSomething(){

enter(bar);
Stage.addGuest(name);
 if(untergekommen==false){
     Counter.addGuest(name)}
         if(untergekommen==false){
             Door.addGuest(name)}
                       if(untergekommen==false){
                               leave();}
}

double a=Math.random();

if(a<0.5){
   leave();
}

}



Könnt ihr mir bitte helfen?
Komme so nicht weiter...

Dankeschön!
 
Zuletzt bearbeitet von einem Moderator:
Also wir, müssen in der Schule für strukturiertes Arbeiten immer erstmal ne UML anlegen, was einem aber auch enorm hilft.😉
Denn weißt du nämlich was wie Klassen aufgestellt sind und welche Methoden und Attribute sie besitzen.
 
Es wurde ein Klassendiagramm zur Verfügung gestellt und daran hatte ich mich auch bereits versucht zu orientieren.
 
Zuletzt bearbeitet von einem Moderator:
Hier ist das Klassendiagramm, das zur Verfügung gestellt wurde.

Mit dem Hinweis, dass nicht behauptet wird, dass es vollständig ist.
 
Java:
public void addGuest(Guest g){


if(nochPlatz==true){
     guests.add(g);
}


}

public boolean nochPlatz(){
boolean platzfrei=false;
if(guests.size()<size){
   platzfrei=true;
 }
return platzfrei;
}

Dann kannst du bei Person nochmal Abfrage ob noch Plätze da sind. Wenn dir die Methode true liefter kann er geadded werden.
 
Zuletzt bearbeitet:
Du wirst bei deinem Gast die Funktionen enter und leave von Person überschreiben müssen und darin eben einen Sitzplatz zuweisen/löschen.
In doSomething lässt du dir einfach einen Zufallswert geben, und wenn der einen bestimmten wert hat, rufst du leave auf.
 
Du wirst bei deinem Gast die Funktionen enter und leave von Person überschreiben müssen und darin eben einen Sitzplatz zuweisen/löschen.
In doSomething lässt du dir einfach einen Zufallswert geben, und wenn der einen bestimmten wert hat, rufst du leave auf.


Wenn ich das richtig verstehe, meinst Du Folgendes:

In die doSomething()-Methode gehört nur das eventuelle Verlassen der Kneipe (jedenfalls vorläufig, in Aufgabe 2 und 3 kommen noch weitere Handlungen hinzu wie z.B. das Bestellen eines Getränks).

Und was meinst Du mit "Überschreiben" der Methoden enter und leave?


[Sind die Methoden enter und leave denn in Person korrekt?]
 
Ein wesentlicher Bestandteil des Objektorientierten Programmierens ist die Möglichkeit, Funktionen zu überschreiben. Wenn du von einer Eltern-Klasse erbst übernimmst du sämtlich Funktionen und Eigenschaften in die Kind-Klasse. Es ist allerdings möglich, in der Kind-Klasse die geerbten Funktionen noch zu überschreiben, sodass sie speziell für die Kind-Klasse etwas anders machen, obwohl sie gleich heißen wie in der Eltern-Klasse und auch genauso aufgerufen werden können.
PS: Könntest du deinen Code in Java-Tags packen, damit man die Schlüsselwörter sieht. Das ist nämlich sonst echt unleserlich.
 
Zuletzt bearbeitet:
Genau das ist der Sinn davon. Wenn eine Person die Bar betritt wird enter aufgerufen. Je nachdem ob es jetzt ein Musiker, ein Gast oder von mir aus ein Polizist ist muss aber dann was anderes geschehen. Darum muss die Funktion für Gast, Musiker und Polizist jeweils anders überschrieben werden.
Die Funktion enter in der Klasse Person stimmt so von dir.
 
Pseudo Code Klasse Guest

betrette bar
guck ob platz bei bühne frei
wenn ja setzen
ansonsten guck ob platz bei theke frei
wenn ja setzen
wenn nicht guck ob platz bei tür frei
ansonsten
wieder rausgehen

Ansonsten auch noch
Java:
public void leave(){
 bar=null; // 0 sondern null;) Weil Bar nen Object ist und kein Integer-Wert ;)
 }
 
Zuletzt bearbeitet:
Könnt ihr mir vielleicht sagen, wo genau ich denn jetzt noch etwas verändern muss (in welchen Klassen), denn irgendwie habe ich gerade die Übersicht verloren, was korrekt ist und was nicht.


Also, Schritt für Schritt:
Die Klasse Area würde ich jetzt nach obigem Vorschlag so schreiben:

Java:
public class Area{

int size;
String name;
List<Guest> guests=new ArrayList<Guest>;

public Area(int size){
this.size=size;
}

public void addGuest(Guest g){

if(nochPlatz()==true){
  guests.add(g);
 }
}

public boolean nochPlatz(){
boolean platzfrei=false;
if(guests.size()<size){
  platzfrei=true;
}

return platzfrei;

}

public void deleteGuest(Guest g){
  guests.remove(g);
 }
}


Die Klasse Bar würde ich so belassen.

Was ist nun mit der Klasse Person.

Was stimmt dort, was ist falsch?

Und wie ist es mit der Klasse Guest:

Da habe ich den Hinweis bekommen, dass ich manche Methoden überschreiben muss und ich muss wohl auch (nachdem ich Area) geändert habe, hier Einiges ändern.
 
Also ich verstehe das so, daß eine Person an sich ja das Attribut hat in keiner Kneipe zu sein, deswegen habe ich in der Klasse Person das Attribut

Java:
Bar bar=null;

Wenn die Methode enter aufgerufen wird, wird als Parameter eine Bar übergeben und dann das Attribut auf die betreffende Bar gesetzt.


In einer Subklasse (z.B. Guest) muss man jetzt anscheinend die Methode enter dazu benutzen, um einen Platz zu suchen.

Wenn ich einen Guest erzeuge: Hat dieser dann nicht immer das Attribut Bar bar=null?

Denn wenn ich für diesen Gast die überschriebene Methode enter benutze, wird da ja etwas Anderes gemacht (nämlich ein Platz gesucht) und nicht das Attribut auf bar gesetzt. :autsch:



EDIT: Oder steht in der Methode enter der Subklasse Guest auch weiterhin

this.bar=bar

nur eben ergänzt durch das "Neue", was die Methode jetzt leisten soll?
 
Zuletzt bearbeitet von einem Moderator:
Nein, in der Methode steht dann erstmal gar nix, sie heißt aber immer noch so:
Java:
class Guest
{
public void enter(Bar bar){

}
}

Das heisst, wenn du willst kannst du this.bar=bar; genauso wie in der Personklasse machen, zusätzlich dann aber noch einen Platz suchen. Zur Erinnerung: Wenn der Gast keinen Platz findet geht er wieder (und Bar bleibt null).
 
Wieso sollte man die bar null setzen, wenn ein Gast "leave" macht?

Jede Person weiß,
in welcher Kneipe sie sich befindet, hat also ein Attribut von Typ Bar. Ist eine Person in keiner
Kneipe, so ist dieses Attribut = null.

Außerdem doch eig. logisch wenn man nicht in einer Bar ist darf man doch auch nicht in der Bar nach plätzen suchen^^

Getreu dem Motto wenn du keinen iApfel hast, hast du keinen iApfel^^
 
Okay, dann war mein letztes EDIT ja okay.


Wie gestaltet sich nun die Platzsuche?

Das ist mir noch etwas schleierhaft.

Der Methode enter übergebe ich ja eine Bar bar.

Diese beinhaltet eine Bühne, eine Theke und einen Türbereich.


Aber wie greife ich nun auf diese zu um zu testen, ob da jeweils Plätze frei sind?:shock:
 
Ojeh da hat einer nicht aufgepasst in der Übungsstunde. In Java gibt es den "." Operator.
Java:
Objectvariable.methode(Parameter);
 
🙁 Doch, ich habe aufgepasst. Aber die Aufgabe finde ich total verwirrend.

Ich würde das dann so machen:

Java:
public class Guest extends Person{

Area area;

public void enter(Bar bar){

this.bar=bar;

if(Stage.nochPlatz()){
 Stage.addGuest;
 area=Stage;
}

else if(Counter.nochPlatz()){
  Counter.addGuest;
  area=Counter;
}

else if(Door.nochPlatz()){
   Door.addGuest;
   are=Door;
}

else leave();


}

public void doSomething(){
double a=Math.random();
if(a<0.5){
 leave();
}

}

Muss ich bei doSeomething die Methode leave() nochmal ganz implementieren? Also mit
public void leave()...






Stimmt der Code so?

:bahnhof:
 
Zuletzt bearbeitet von einem Moderator:
Nein das stimmt so nicht. Die Variable Stage gibt es in der Klasse Guest nicht. Du musst die Variable Stage, welche in deiner Bar Variable liegt aufrufen.
Java:
public class Bar{

Area Stage;        <- Die musst du aufrufen
Area Counter;
Area Door;
List<Waiter> waiter=new ArrayList<Waiter>;
List<Musician> musicians=new ArrayList<Musician>;
int maximumNumberOfWaiter;
int maximumNumberOfMusicians;
double cashBox;

Noch eine Anmerkung: Gewöhne dir an Klassen groß zu schreiben und Variablen klein. "Area stage" wäre richtig.
 
Ich weiß nicht, was Du meinst...

Ich hätte gesagt: Weil man doch als Parameter eine Bar übergibt, die ihrerseits als Attribute (des Typs Area) Stage, Door und Counter hat.


Stimmt der Code also nicht?
 
Es tut mir wirklich leid, dass ich mich so schwer tue.

Aber wie könnte ich denn jetzt die Methode, die Du eben gerade vorschlägst benutzen, um nun zu schauen, ob bei Stage Plätze frei sind?


EDIT: Hat sich durch Dein EDIT gerade erledigt.
 
Fehlen da die Klammern?

Muss bar.getStage().nochPlatz(); lauten, oder?


Dann habe ich jetzt für die Klasse Guest:

Java:
public class Guest extends Person{

Area area;

public void enter(Bar bar){

this.bar=bar;

if(bar.getStage().nochPlatz()){
 bar.getStage().addGuest;
 area=Stage;
}

else if(bar.getCounter().nochPlatz()){
  bar.getCounter().addGuest;
  area=Counter;
}

else if(bar.getDoor().nochPlatz()){
   bar.getDoor().addGuest;
   are=Door;
}

else leave();


}

public void doSomething(){
double a=Math.random();
if(a<0.5){
 leave();
}

}

.






Stimmt der Code nun😳 so?
 
Bei der Klasse Area gibt es die Methode addGuest(Guest g)
also
bar.getStage().addGuest(Parameter);
....

jetzt bin ich mir nicht ganz sicher aber also Parameter müsste man glaube this verweden
bar.getStage().addGuest(this);
ganz sicher bin ich mir da aber nicht 😳
 
Bei der Klasse Area gibt es die Methode addGuest(Guest g)
also
bar.getStage().addGuest(Parameter);
....

Das soll heißen, dass ich den Code kürzen kann?

Also nur

bar.getStage().addGuest(this)?

Aber wie verhindere ich dann, daß danach nicht bei

bar.getCounter().addGuest(this)

der Gast auch dort eingetragen wird?


EDIT: Quark! Du wolltest mir mitteilen, daß ich den Parameter vergessen habe.
 
Zuletzt bearbeitet von einem Moderator:
So in etwa 🙂

Java:
public class Guest extends Person{

Area area=null;

public void enter(Bar bar){

this.bar=bar;

if(bar.getStage().nochPlatz()){
 bar.getStage().addGuest(this);
 area=bar.getStage();
}

else if(bar.getCounter().nochPlatz() && area==null){
  bar.getCounter().addGuest(this);
  area=bar.getCounter();
}

else if(bar.getDoor().nochPlatz() &&  area==null){
   bar.getDoor().addGuest(this);
   area=bar.getDoor();
}

else leave(); // area=null?!? steht das bei Person?, weil wenn er in keiner Bar ist kann er auch keiner 
// area sein. Auch muss es von der Liste der Personen in einer Area wieder verschwinden wenn er     // raus geht


}

public void doSomething(){
double a=Math.random();
if(a<0.5){
 leave();
}

}
 
Ich habe mit leave() so meine Probleme.

Bei Person ist der Rumpf: bar=null;


Aber hier bei Guest?

Immer noch bar=null; wenn alle Plätze besetzt sind und der Gast wieder gehen muss.

Und dann noch Austragen aus der Liste...

Ich würde also das so vorschlagen:

Kann man das so machen, dass man einmal die Originalmethode aus Personen nimmt?

Und das andere Mal (wenn man sich austragen muss) überschreibt??
 
Du kannst wie schon im Theard angeschnitte eine Methode überschreiben. Dann einfach in der Klasse nochmal public void leave() schreiben.
Ist aber die Frage ob Waiter,Musican... auch die Bar verlassen können und sich dann von der Liste der Personen die insgesamt in der Bar sind streichen müssen.
 
Ja okay, ich muss die Methode leave() jeweils überschreiben.


Trotzdem gibts für mich zwei Situationen:

1.) Ein Guest verlässt die Kneipe, dann muss ich ihn aus der Liste austragen und area=null; schreiben.

2.) Ein Guest kommt gar nicht erst in Kneipe rein.

Oder habe ich das falsch verstanden und ich muss die leave-Methode gar nicht im 2. Fall benutzen, weil er ja gar nicht reinkommt?


Könnte ich den letzten else Zweig also ganz weglassen?


Ich würde dann die leave() Methode also in doSomething erst das erste Mal benutzen?
 
Peusdo:

Guest geht in Bar. -> kennt Bar
checkt ob irgendwo Platz -> findet keinen
geht raus -> Bar eine Person weniger drinne

Guest geht in Bar. -> kennt Bar
checkt ob irgendwo Platz -> findet platz
geht wieder raus -> Bar einer weniger, Area einer weniger


rausgehen
Die Bar kennst du jetzt nicht mehr.
Warst du in einer area?? (area!=null), dann trag dich aus.
 
Meine Idee zu leave() wäre dann:

Java:
public void leave(){
bar=null;

if(area !=null){
bar.area.deleteGuest(this);
}


Zeile 5 ist wieder heikel...



Und was meinst Du mit "Eine Person weniger drinne."

Wie ist das zu realisieren?




Diese Aufgabe schafft mich noch...
 
Ich habe mir das nochmal durch den Kopf gehen lassen und meine Klasse Guest sieht nun so aus:


Java:
public class Guest extends Person{

Area area=null;

public void enter(Bar bar){
this.bar=bar;

if(bar.getStage().nochPlatz()){
   bar.getStage().addGuest(this);
   area=bar.getStage();
  }

else if (bar.getCounter().nochPlatz() && area==null){
   bar.getCounter().addGuest(this);
   area=bar.getCounter();
}

else if (bar.getDoor().nochPlatz() && area==null){
   bar.getDoor().addGuest(this);
   area=bar.getDoor();
}

else leave();


public void leave(){
  bar=null;

  if(area!=null){
        if(area==getStage()){
           bar.getStage().deleteGuest(this);
           area=null;}
        else if (area==getCounter()){
           bar.getCounter().deleteGuest(this);
           area=null;}
               else { bar.getDoor().deleteGuest(this);
                        area=null;}
}

public void doSomething(){
   double a=Math.random();
     if(a<0.5){
           leave();
      }
}

 
}

Könntet Ihr Euch das bitte nochmal ansehen?
 
Da kommen so viele Fehlermeldungen, alleine, wenn ich nur die Klasse Area kompilieren will: s. Screenshot

Was nun?
 
Zuletzt bearbeitet von einem Moderator:
Nein.

Ich habe schon viele Fehler beseitigt (das waren sehr dumme Bezeichnungsfehler...), aber 8 Fehler sind noch übrig.

Also die, wo die Klassen Waiter und Musician nicht gefunden werden, sind klar, denn die habe ich ja noch nicht geschrieben!


Aber die anderen 2 Fehler sind mir nicht klar.


s. Screenshot:

Guest.java 6

Bar.java 28


EDIT:

Okay, wieder ein Fehler weniger, nämlich der in Bar.java 28, da musste ich das anders schreiben mit &&.

Bleibt noch der Fehler Guest.java 6. Liegt der vielleicht daran, dass die vererbende Klasse Person einen Konstruktor hat, die erbende Klasse Guest aber keinen? Muss Guest auch einen Konstruktor haben?
 
Zuletzt bearbeitet von einem Moderator:
Ich habe jetzt die Fehler oben beseitigen können (bis auf die 6 die bleiben, weil die Klassen Waiter und Musician noch fehlen).

Hier mein Versuch zur Klasse Musician:


Java:
// Die Klasse Musician (Aufgabe 1)

public class Musician extends Person{

String instrument;

public Musician(String name, String instrument){
super(name);
this.instrument=instrument;
}

public void enter(Bar bar){

this.bar=bar;

bar.FuegeMusikerHinzu(this);


}

public void leave(){
bar=null;
bar.EntferneMusiker(this);
}


public String gibInstrument(){
	return instrument;
	
}

public void doSomething(){
double b=Math.random();

if(b<0.5){
  leave();
}

gibInstrument();


}

}


In dem Text steht, dass ein Musiker, der die Kneipe betritt, sich in die Liste für die Musiker einträgt. Das habe ich ja oben drin. Aber muss man da nicht vorher noch eine Fallunterscheidung machen, ob er sich überhaupt eintragen kann??
 
Könnte ich das vielleicht mit einer if-else-Bedingung machen.

Also in der Methode enter?


Meine NEUE IDEE ist dann diese hier:


Java:
// Die Klasse Musician (Aufgabe 1)

public class Musician extends Person{

String instrument;
boolean darfmusizieren=false;

public Musician(String name, String instrument){
super(name);
this.instrument=instrument;
}

public void enter(Bar bar){

this.bar=bar;
// Neue Methode in der Klasse Bar: getSizeOfListOfMusician();
//Sieht so aus:
// public int getSizeOfListOfMusician(){
//         return musician.size();
// }  

if(bar.getSizeOfListOfMusician()<5){
   bar.FuegeMusikerHinzu(this);
   darfmusizieren=true;
}
else leave();

}

public void leave(){
bar=null;

if(darfmusizieren=true){
bar.EntferneMusiker(this);
}

}


public String gibInstrument(){
	return instrument;
	
}

public void doSomething(){
double b=Math.random();

if(b<0.5){
  leave();
}

gibInstrument();


}

}



Wäre das so okay?


Zumindest wird keine zusätzliche Fehlermeldung ausgegeben. 😀
 
Zuletzt bearbeitet von einem Moderator:
Halte dich doch einfach an deine schon äußerst umfangreiche und gut geschriebene Angabe:
Ein Musiker ist eine Person. Er besitzt immer ein Instrument, welches im Konstruktor
übergeben wird. Beim Aufruf der Methode doSomething() gibt er an, welches Instrument er
gerade spielt. Beim Betreten der Kneipe wird der Musiker in die Liste für die Musiker eingetragen.
von darfmusizieren steht hier nirgendwo was drinnen, davon dass der Musiker alkohol trinkt und dann die Bar verlassen muss steht auch nichts da. Mach einfach das was in der Angabe steht und nicht mehr.
if(bar.getSizeOfListOfMusician()<5) sieht übrigens rightig aus,
if(darfmusizieren=true) allerdings ist immer true weil = eine Zuweisung und kein Vergleich ist.
 
Zuletzt bearbeitet:
Halte dich doch einfach an deine schon äußerst umfangreiche und gut geschriebene Angabe:

Ich finde diese Aufgabe aber eben nicht gut formuliert.

Da steht nur, dass der Musiker beim Eintritt in die Liste der Musiker eingetragen wird.

Aber vielleicht wird er ja gar nicht eingetragen, nämlich dann, wenn schon alle Musiker (5) da sind! Dann darf er eben nicht musizieren, weil die Liste voll ist. So meine ich darfmusizieren.

Und wo habe ich denn etwas zusätzlich gemacht, was nicht in der Aufgabe steht?



Ich erkenne aus der Aufgabe auch zum Beispiel nirgends, ob bei doSomething() hier auch wieder zufällig entschieden werden soll, ob der Musiker die Bar verlässt.


Ich habe das einfach mal gemacht.
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben