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:

discipulo

Mitglied
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.
 

babuschka

Top Contributor
Es wurde ein Klassendiagramm zur Verfügung gestellt und daran hatte ich mich auch bereits versucht zu orientieren.
 
Zuletzt bearbeitet von einem Moderator:

babuschka

Top Contributor
Hier ist das Klassendiagramm, das zur Verfügung gestellt wurde.

Mit dem Hinweis, dass nicht behauptet wird, dass es vollständig ist.
 

discipulo

Mitglied
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:

bERt0r

Top Contributor
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.
 

babuschka

Top Contributor
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?]
 

bERt0r

Top Contributor
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:

bERt0r

Top Contributor
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.
 

discipulo

Mitglied
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:

babuschka

Top Contributor
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.
 

babuschka

Top Contributor
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:

bERt0r

Top Contributor
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).
 

discipulo

Mitglied
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^^
 

babuschka

Top Contributor
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:
 

bERt0r

Top Contributor
Ojeh da hat einer nicht aufgepasst in der Übungsstunde. In Java gibt es den "." Operator.
Java:
Objectvariable.methode(Parameter);
 

babuschka

Top Contributor
:( 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:

bERt0r

Top Contributor
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.
 

babuschka

Top Contributor
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?
 

babuschka

Top Contributor
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.
 

babuschka

Top Contributor
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:oops: so?
 

discipulo

Mitglied
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 :oops:
 

babuschka

Top Contributor
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:

discipulo

Mitglied
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();
}

}
 

babuschka

Top Contributor
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??
 

discipulo

Mitglied
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.
 

babuschka

Top Contributor
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?
 

discipulo

Mitglied
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.
 

babuschka

Top Contributor
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...
 

babuschka

Top Contributor
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?
 

babuschka

Top Contributor
Da kommen so viele Fehlermeldungen, alleine, wenn ich nur die Klasse Area kompilieren will: s. Screenshot

Was nun?
 
Zuletzt bearbeitet von einem Moderator:

babuschka

Top Contributor
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:

babuschka

Top Contributor
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??
 

babuschka

Top Contributor
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. :D
 
Zuletzt bearbeitet von einem Moderator:

bERt0r

Top Contributor
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:

babuschka

Top Contributor
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:
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Verständnisfrage zur Modellierung einer HDD Java Basics - Anfänger-Themen 17
I Arbeitszeit / Zeiterfassung - Gedanken und Modellierung Java Basics - Anfänger-Themen 122
L Modellierung Widerstandsnetzwerk Java Basics - Anfänger-Themen 15
M Problem in der Modellierung Java Basics - Anfänger-Themen 20
N Modellierung, vererbung, Java Basics - Anfänger-Themen 163
F OO - Modellierung Java Basics - Anfänger-Themen 24
S Modellierung von Karteneffekten ähnlich YUGIOH Java Basics - Anfänger-Themen 2
1 Modellierung eines Bankkunden Java Basics - Anfänger-Themen 6
N Modellierung eines Programms in UML (Klassendiagramm) Java Basics - Anfänger-Themen 2
A Modellierung Java Basics - Anfänger-Themen 8
M Modellierung eines trivialen Web-Shops Java Basics - Anfänger-Themen 12
M Ausgabe einer ArrayList ensteht nur als Hashcode, nicht als Objekt Java Basics - Anfänger-Themen 16
D 2 ArrayListen gleich sortieren bzw. eine Liste anhand einer anderen Sortieren Java Basics - Anfänger-Themen 6
ixChronos Letzten 4 Ziffern einer großen Zahl ausgeben Java Basics - Anfänger-Themen 3
P Objekt einer Methode eines anderen Objektes übergeben Java Basics - Anfänger-Themen 5
L Variablenwerte aus einer Methode übergeben Java Basics - Anfänger-Themen 2
E Arrays in einer ArrayList miteinander vergleichen Java Basics - Anfänger-Themen 12
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
Shadowrunner Variablen Gibt es eine Möglichkeit die Ziffern/Stellen einer Zahl fest zu legen? Java Basics - Anfänger-Themen 3
D remove Object von einer Liste von Obejcts Java Basics - Anfänger-Themen 3
FunkyPhil94 Wert in einer Lambda Funktion erhöhen Java Basics - Anfänger-Themen 3
T Aufruf der Methode einer Oberklasse, wenn sie in der Unterklasse überschrieben ist. Polymorphie. Java Basics - Anfänger-Themen 2
B Kommunikation mit Seriellen Schnittstellen + Integration einer lib Java Basics - Anfänger-Themen 1
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
P Welches SDK für das erstellen einer ausführbaren Datei? Java Basics - Anfänger-Themen 4
D Länge einer Liste aufrufen. Java Basics - Anfänger-Themen 19
J Klassen Instanzen einer Klasse in einer anderen unabhängigen Klasse nutzen Java Basics - Anfänger-Themen 4
B Alle Strings bis zu einer Maimallänge aufzählen, die Bedingung erfüllen Java Basics - Anfänger-Themen 13
marcelnedza Finde meinen Fehler in einer Methode nicht, Java Karol Java Basics - Anfänger-Themen 15
Soranix Erste Schritte Struktur als Anfänger // Von einer Klasse auf ein Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 6
MoxMorris Wie macht man String[] = String[] aus einer anderer Methode? Java Basics - Anfänger-Themen 18
T Fibonacci mit einer Hilfsmethode berechnen Java Basics - Anfänger-Themen 10
S Hilfe zu einer Aufgabe Java Basics - Anfänger-Themen 5
M Radius von einer ellipse bestimmen Java Basics - Anfänger-Themen 7
Say Fehlenden Code finden in einer while-Schleife? Java Basics - Anfänger-Themen 11
M Zufallszahl generieren mit einer linken und rechten Grenze Java Basics - Anfänger-Themen 3
N Was Passiert mit dem Namen einer Variable, wenn man diese einer Liste Hinzufügt Java Basics - Anfänger-Themen 16
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
W String einer Textdatei in einzelne Stringobjekte pro Zeile aufteilen Java Basics - Anfänger-Themen 14
W Objekte einer ArrayList in txt-datei schreiben mit Paths? Java Basics - Anfänger-Themen 2
S Best Practice Fragen zu Projektstruktur einer Datenbank-Abfrage-App (MVC) Java Basics - Anfänger-Themen 13
T Variable von Objekten in einer Methode überprüfen Java Basics - Anfänger-Themen 26
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
S Textausgabe in einer For-Schleife Java Basics - Anfänger-Themen 12
M Spezifischen Wert einer Zeile aus .txt Datei entnehmen Java Basics - Anfänger-Themen 15
B Popups mit Klicksabfangen zumAusfüllen einer .ods Datei Java Basics - Anfänger-Themen 0
M RandomAccessFile int und String gleichzeitig in einer Datei Java Basics - Anfänger-Themen 49
E Suchfunktion in einer Liste Java Basics - Anfänger-Themen 39
T ungeordnete Werte-Paare in einer Liste Java Basics - Anfänger-Themen 7
FireHorses Einen Command erst nach einer Chateingabe aktivieren Java Basics - Anfänger-Themen 1
frager2345 Singleton-Muster Java ->Nur eine Instanz einer Klasse erzeugen können Java Basics - Anfänger-Themen 45
F wie kann ich die Position des letzten Vokals innerhalb einer Zeichenkette ermitteln? Java Basics - Anfänger-Themen 5
H Kapselung protected aber in einer Kindklasse nicht zugänglich Java Basics - Anfänger-Themen 5
R Methoden Werte einer ArrayList als Parameter übergeben. Java Basics - Anfänger-Themen 4
B Den Dateipfad einer Java Datei durch Code in Selbiger finden? Java Basics - Anfänger-Themen 10
LilliCherry Array in einer Zeile ausgeben Java Basics - Anfänger-Themen 6
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
L Dauerhaftes Speichern einer Eingabe bei einer ArrayList Java Basics - Anfänger-Themen 26
V Hilfe bei Implementierung einer boolean Methode Java Basics - Anfänger-Themen 6
G Position einer unbekannten 3-stelligen-Zahl in einem String finden Java Basics - Anfänger-Themen 15
stormyark Fehler beim überschreiben einer Variable Java Basics - Anfänger-Themen 1
H Kompliziertes Sortieren einer ArrayList mit Objekten(Sortieren nach X und Y) Java Basics - Anfänger-Themen 11
T Permanentes speichern von Objekten in einer ArrayList Java Basics - Anfänger-Themen 6
Saiko Zeilen einer Datei einlesen Java Basics - Anfänger-Themen 3
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
G zwei Instanzen einer Klasse Java Basics - Anfänger-Themen 29
sserio Prüfziffer einer ISBN Nummer herrausfinden. Java Basics - Anfänger-Themen 14
J Benennung einer mir unbekannten Java - Ausdrucksweise Java Basics - Anfänger-Themen 5
LFB In einer For-Schleife alles in einer Zeile ausgeben Java Basics - Anfänger-Themen 14
sserio Wie kann man nach einer Klasse fragen? Java Basics - Anfänger-Themen 12
berserkerdq2 Wann soll ich den Stream schließen, wenn ich das in einer Methode habe? Java Basics - Anfänger-Themen 8
berserkerdq2 Wie gebe ich den Pfad zu einer Datei an, die in einem Ordner in Eclipse ist? Java Basics - Anfänger-Themen 1
M Variable in einer Schleife initialisieren Java Basics - Anfänger-Themen 46
D EinMalEins mithilfe einer for-Schleife und Array Java Basics - Anfänger-Themen 1
J int innerhalb einer Datei ändern Java Basics - Anfänger-Themen 1
D Hilfe bei einer Aufgabe mit for-Schleife Java Basics - Anfänger-Themen 6
Neuling47 Ich zerbreche mit den kopf an einer Aufgabe Java Basics - Anfänger-Themen 61
H Mit setter-Methode JLabel in einer andern Klasse ändern. Java Basics - Anfänger-Themen 40
J Zelleninhalt einer Jtable löschen Java Basics - Anfänger-Themen 2
Robert_Klaus Hamster java Simulation Hilfe bei einer Aufgabe Java Basics - Anfänger-Themen 5
stormyark 4 Bit in einer for-schleife funktioniert nicht Java Basics - Anfänger-Themen 3
F Werte in einer Arraylist Zählen Java Basics - Anfänger-Themen 2
M ArrayList mit einer Schleife befüllen Java Basics - Anfänger-Themen 2
A Ein Array bearbeiten und in einer anderen Methode nutzen Java Basics - Anfänger-Themen 6
A Ergebnis einer Methode bei einer anderen verwenden Java Basics - Anfänger-Themen 13
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
I Liste von Infos von einer eigenen Annotation in Liste speichern Java Basics - Anfänger-Themen 0
M Wie kann ich den Index i von einer LinkedList überprüfen? Java Basics - Anfänger-Themen 36
M Wie kann die Implementation einer Methode den Wert eines Attributs vermindern? Java Basics - Anfänger-Themen 3
M Wie verknüpfe ich eine Bedingung mit einer Methode ohne if-Verzweigung & Bedingungsoperator? Java Basics - Anfänger-Themen 2
P Doppelte werte in einer Liste zählen Java Basics - Anfänger-Themen 11
javapingu Jeglichen Inhalt einer Textdatei nach Zeile n löschen Java Basics - Anfänger-Themen 8
D mehrere Berechnungen in einer Methode Java Basics - Anfänger-Themen 9
P Iterieren mit einer Foreach in Lambdaschreibweise und Counter. Java Basics - Anfänger-Themen 1
M Methoden Wert einer Variable geht verloren? Java Basics - Anfänger-Themen 6
W Wie ziehe ich von einer bestimmten Zahl, Zahlen ab, bis mein Ergebnis null beträgt? Java Basics - Anfänger-Themen 10
X Was ist der Unterschied zwischen materialisierten und nichtmaterialisierten Attributen einer Klasse? Java Basics - Anfänger-Themen 1
U Wie ein Attribut von einer Klassenmethode in der Klasse speichern= Java Basics - Anfänger-Themen 2
M Wie richte ich eine Diagonale an Robotern in einer World ein? Java Basics - Anfänger-Themen 15

Ähnliche Java Themen

Neue Themen


Oben