# Objektkommunikation



## Slaid (11. Mai 2014)

Hey, 

Ich habe ein kleines Problem und weiß nicht wie ich genau weiter vorgehen soll.

folgendes UML Diagramm ist gegebenen.





Der ganze Kram soll nun so auszugeben sein.  


```
public class Aufgabe17_3 
{		
	public static void main (String[]args)
	{
		
		Uhrzeit u = new Uhrzeit(12, 54);
		System.out.println(u);
		
		Mitarbeiter m = new Mitarbeiter("Max", "Mustermann", "mustermann@beispiel.com");
		
		System.out.println(m);
		
		Raum r = new Raum(18, 0, 1);
		System.out.println(r);
		
		Mitarbeiter m1 = new Mitarbeiter("Max", "Mustermann", "mustermann@ex.com");
		Mitarbeiter m2 = new Mitarbeiter("Tessa", "Loniki", "loniki@ex.com");
		Raum r1 = new Raum(18,0,1);
		Raum r2 = new Raum(2,1,9);
		Raum r3 = new Raum(2,1,10);
		
		m1.reserviere(r1, new Uhrzeit(12, 30), new Uhrzeit(14, 30), "VOOP");
		m1.reserviere(r2, new Uhrzeit(14, 30), new Uhrzeit(16, 30), "WebTech");
		m2.reserviere(r2, new Uhrzeit(12, 30), new Uhrzeit(13, 30), "Prog II");
		m2.reserviere(r3, new Uhrzeit(9, 30), new Uhrzeit(11,30), "ITM");
	
		System.out.println(r1);
		System.out.println(r2);
		System.out.println(r3);	
	}
}
```

bei 	
	
	
	
	





```
System.out.println(r1);
```
soll 
Raum 18-0.1
     gebucht von Max Mustermann (max.mustermann@beispiel.com) von 12:30 Uhr bis 14:30 für VOOP 

ausgegeben werden. 
Da ich nicht genau weiß wo mein Problem ist... werde ich einfach alle Klassen hier posten und hoffe, dass jemand was findet 


Die Uhrzeit ist klar...

```
package Aufgabe17_3;

public class Uhrzeit 
	{
		private int uhr;
		private int minute;
		private int stunde;
		
		
		public Uhrzeit(int m, int s) 
		{
			this.minute = m;
			this.stunde = s;
		}
		
		public String toString() 
		{
			return this.minute + ":" + this.stunde;
		}
		
	}
```



```
package Aufgabe17_3;

import java.util.LinkedList;
import java.util.List;

	public class Mitarbeiter extends Person
	{
		
		protected List<Reservierung> buchung = new LinkedList<Reservierung>();
		private String email;
	
		public Mitarbeiter(String v, String n, String e) 
		{
			super(v,n);
			this.email = e;
		}
		
		public String toString() 
		{
			return super.toString() + " (" + email + ")";
		}

		public void reserviere(Raum r1, Uhrzeit uhrzeit, Uhrzeit uhrzeit2,
				String string) 
		{
			return;	
		}	
	}
```

beim Public reserviere habe ich überhaupt keine Ahnung wie ich jetzt alles ausgeben kann ... Ich habe nun einfach mal mit return; den Befehl beendet, damit es keine Fehlermeldung gibt.


Class Person dürfte auch richtig sein.

```
package Aufgabe17_3;

public class Person {
		
		private String vorname;
		private String nachname;
		
		public Person (String v, String n) {
			this.vorname = v;
			this.nachname = n;
		}
		
		public String toString() {
			return vorname + " " + nachname;
		}
	}
```



Bei der Reservierung bin ich mir schon wieder unsicher ... :bahnhof:

```
package Aufgabe17_3;

import java.util.LinkedList;
import java.util.List;


public class Reservierung {
	
	protected Raum raum;
	protected Mitarbeiter von;
	
	private String bemerkung;
	private Uhrzeit beginn;
	private Uhrzeit ende;
	
	public Reservierung(String b, Uhrzeit a, Uhrzeit e) {
		this.bemerkung = b;
		this.beginn = a;
		this.ende = e;
	}
	
	public void setBemerkung(String b) {
		this.bemerkung = b;
	}
	
	public void setMitarbeiter(Mitarbeiter m) {
		this.von = m;
	}
	
	public void setRaum(Raum r) {
		this.raum = r;
	}
	
	public String toString() {
		return "gebucht von " + von + " von " + beginn + " bis " + ende 
				+ " f??r " + bemerkung;
	}
}
```

und zum Schluss 

```
package Aufgabe17_3;

public class Raum 
{
	private int geb;
	private int etage;
	private int raum;
	
	
	public Raum (int g, int e, int r)
	{
		
		this.geb = g;
		this.etage = e;
		this.raum = r;
	}
	public Reservierung addReservierung(Reservierung reserviere)
	{
		return reserviere;
	}
	public String toString()
	{
		return "Raum " + this.geb + "-" + this.etage + "." + this.raum;
	}
	
	
}
```

dort habe ich überhaupt keine Ahnung,  wie ich die Methode addReservierung dort einbinden könnte.

Ich hoffe jemand kann mir helfen ... 

Danke im Voraus


----------



## strußi (11. Mai 2014)

du erstellst eine object vom Typ mitarbeiter
Mitarbeiter maxMuster001 =new Mittarbeiter( "Max", "Mustermann,", "max.mustermann@beispiel.com");

Reservieren geht dann so
Methode maxMuster001.reserviere( "gebäude", "etage", "raum", uhrzeitStart, uhrzeitEnde", "bemerkung", "mitarbeiter");
 //in der Methode reserviere erstellst du ein Object vom Typ Reservierung, und rufst dann die Methoden

```
public void reserviere( "gebäude", "etage", "raum", uhrzeitStart, uhrzeitEnde", "bemerkung", "mitarbeiter"){
   Reservierung res =new Reservierung(uhrzeitStart, uhrzeitEnde);
   res.setRaum( gebäude, etage, raum);
   res.setBemerkung( bemerkung);
   res.setMitarbeiter( mitarbeiter);

   //und nun noch 
   buchung.add( res.toString); //die reservierung in die LinkedList hinzufügen
}
```


----------



## njans (11. Mai 2014)

Naja du brauchst intern im Raum eben eine Liste, die speichert, welche Reservierungen auf den Raum existieren. Generell sollte wohl addReservierung nichts zurückgeben.


----------



## Slaid (11. Mai 2014)

Hm schonmal danke für die schnelle Antwort... 

Ich habe dein Quellcode mal eingefügt bekomme aber einen Syntax Error ... 

und ja im Raum sollte eine Liste sein. Hab die "add" Funktion erstmal so erstellt damit es keine Fehlermeldung gibt ... 

Nur stehe ich gerade so dermaßen auf dem Schlauch, dass ich mittlerweile gar nichts mehr weiß

:bahnhof:???:L


----------



## strußi (11. Mai 2014)

klar das er syntaxfehler hat, den hab ich nicht im editor geschrieben, sonder hier ;-)


----------



## Slaid (11. Mai 2014)

Ich hab den ja auch angepasst ... trotzallem bekomme ich das Programm nicht zum laufen ...


----------



## strußi (11. Mai 2014)

reservierung muss noch von raum erben

so wie in deinem uml-diagramm

sag ml ist das ein foto, oder hast du dafür eine Software benutzt, und wenn ja, welche?


----------



## Slaid (12. Mai 2014)

Hey es handelt sich um eine Grafik ... 


Wie lass ich denn Reservierung richtig vom Raum erben ?
Ich stehe gerade so auf dem Schlauch und bekomme gar nichts mehr hin :bahnhof:


----------



## nvidia (12. Mai 2014)

Slaid hat gesagt.:


> Wie lass ich denn Reservierung richtig vom Raum erben ?[...]



Gar nicht, da die eingezeichnete Assoziation keine Vererbungsbeziehung darstellt. Hast du dich schon mal über Assoziationen informiert? Assoziation (UML) ? Wikipedia, http://michael.hahsler.net/JAVA/pdf/beziehungen.pdf, Galileo Computing :: Praxisbuch Objektorientierung – 4.3 Beziehungen zwischen Objekten etc. Es gibt im Netz wirklich dutzende Quellen zu diesem Thema. Und wahrscheinlich wird es sogar in den Materialien beschrieben die du erhalten hast bevor man dir diese Aufgabe stellte...


----------



## Harry Kane (12. Mai 2014)

Slaid hat gesagt.:


> Wie lass ich denn Reservierung richtig vom Raum erben ?


Stimme nvidia zu. Reservierung sollte NICHT von Raum erben. Die Linie zwischen Reservierung und Raum zeigt keine Vererbung an, sondern lediglich Komposition, so wie die Linie zwischen Mitarbeiter und Reservierung.
Raum braucht lediglich eine Liste mit Reservierungen (LinkedList/ArrayList o.ä.). Das sollte es schon sein.
Für Extrapunkte:
Wenn du einem Raum eine neue Reservierung hinzufügst, kannst du durch alle Reservierungen gehen, die schon in der Liste stehen und schauen, ob die Startuhrzeit der neuen Reservierung vor dem Ende einer bereits vorhandenen Reservierung liegt. Wenn ja, ist der Raum "überbucht", und du könntest eine IllegalArgumentException werfen.


----------



## trez (12. Mai 2014)

strußi hat gesagt.:


> reservierung muss noch von raum erben
> 
> so wie in deinem uml-diagramm



Von welchem UML-Diagramm redest du?

Bei dem hier geposteten besteht KEINE Vererbung zwischen Reservierung und Raum, sondern nur eine 1..n Beziehung.

Also muss in der Klasse "Raum" eine Liste von Reservierungen vorhanden sein


----------



## Slaid (14. Mai 2014)

Hey,

Ich hab mit einer weiteren Person den Kram umgebastelt und sind nun nur noch an einer Stelle am rätseln wie wir das Problem lösen können. 

Unsere Main

```
package Aufgabe17_3LuisaIch;
public class Test {
	public static void main(String[] args) {
		
		Uhrzeit u1 = new Uhrzeit(12, 54);
		System.out.println(u1);
		
		Mitarbeiter m1 = new Mitarbeiter("Max", "Mustermann", "mustermann@ex.com");
		System.out.println(m1);
		
		Raum r1 = new Raum(18, 0, 1);
		System.out.println(r1);
		
		m1.reserviere(r1, new Uhrzeit(12, 30), new Uhrzeit(14, 30), "VOOP");

		
		/*Mitarbeiter m2 = new Mitarbeiter("Tessa", "Loniki", "loniki@ex.com");
		Raum r1 = new Raum(18,0,1);
		Raum r2 = new Raum(2,1,9);
		Raum r3 = new Raum(2,1,10);
		
		m1.reserviere(r2, new Uhrzeit(14, 30), new Uhrzeit(16, 30), "WebTech");
		m2.reserviere(r2, new Uhrzeit(12, 30), new Uhrzeit(13, 30), "Prog II");
		m2.reserviere(r3, new Uhrzeit(9, 30), new Uhrzeit(11,30), "ITM");
	*/
		}
}
```

Die Raum Klasse

```
package Aufgabe17_3LuisaIch;
import java.util.LinkedList;
import java.util.List;

public class Raum {
	
	protected Reservierung reservierung;
	
	protected List<Reservierung> reservierungen = new LinkedList<Reservierung>();
	
	private int geb;
	private int etage;
	private int raum;
	
	public Raum(int g, int e, int r) {
		this.geb = g;
		this.etage = e;
		this.raum = r;
	}

	public String toString() {
		String ret = "";
		if (reservierungen.isEmpty()) {
			ret += "Raum " + geb + "-" + etage + "." + raum;
		}
		else {
			for (Reservierung o : reservierungen) {
				ret += "Raum " + geb + "-" + etage + "." + raum + "\n" +
			reservierung.toString(); //läuft nicht
									
			}
		}
		return ret;
	}
	
	public void addReservierung(Reservierung r) {
			reservierungen.add(r);	
	}
}
```

Hier sagt er dass Reservierung o: 
Variable not used und naja 


```
else {
			for (Reservierung o : reservierungen) {
				ret += "Raum " + geb + "-" + etage + "." + raum + "\n" +
			reservierung.toString(); //läuft nicht
									
			}
		}
		return ret;
```

Vllt könnt ihr mir den letzten Schritt verraten ... morgen muss der Kram laufen 

Liebe Grüße


----------



## VfL_Freak (14. Mai 2014)

Moin,



> ```
> for (Reservierung o : reservierungen)
> {
> ret += "Raum " + geb + "-" + etage + "." + raum + "\n" +
> ...


Natürlich nicht !!

*Reservierung  != reservierung *

gruß
Klaus


----------



## Slaid (14. Mai 2014)

Mh. 
Was muss denn sonst da rein ? 

Bin ehrlich gesagt überfragt .. 

Liebe Grüße


----------



## VfL_Freak (14. Mai 2014)

Slaid hat gesagt.:


> Mh.
> Was muss denn sonst da rein ?


entweder Groß- ODER Kleinschreibung ... Du musst Dich schon für eins entscheiden ;(


```
for (Reservierung o : reservierungen)    // hier Großgeschrieben deklariert !!!
{
            ret += "Raum " + geb + "-" + etage + "." + raum + "\n" +
            reservierung.toString();  // hier Kleingeschrieben verwendet !!!
```


----------



## Slaid (14. Mai 2014)

Okay das habe ich jetzt auch verstanden 

:toll:

```
else {
			for (Reservierung o : reservierungen) {
				ret += "Raum " + geb + "-" + etage + "." + raum + "\n" +
			Reservierung.toString(); //läuft nicht
									
			}
		}
		return ret;
```

Nur habe ich jetzt ein Problem mit dem toString ...


----------



## VfL_Freak (14. Mai 2014)

Slaid hat gesagt.:


> Nur habe ich jetzt ein Problem mit dem toString ...


Und das bedeutet WAS ???:L


----------



## Slaid (14. Mai 2014)

Ich hatte gehofft, dass du mir das beantworten könntest.. 

Eclipse gibt mir die Fehlermeldung 

Cannot make a static reference to the non-static method toString() from the type Reservierung


```
package Aufgabe17_3LuisaIch;
public class Reservierung {
	
	protected Raum raum;
	protected Mitarbeiter von;
	
	private String bemerkung;
	private Uhrzeit beginn;
	private Uhrzeit ende;
	
	public Reservierung(String b, Uhrzeit a, Uhrzeit e) {
		this.bemerkung = b;
		this.beginn = a;
		this.ende = e;
	}
	
	public void setBemerkung(String b) {
		this.bemerkung = b;
	}
	
	public void setMitarbeiter(Mitarbeiter m) {
		this.von = m;
	}
	
	public void setRaum(Raum r) {
		this.raum = r;
	}
	
	public String toString() {
		return "gebucht von " + von + " von " + beginn + " bis " + ende 
				+ " für " + bemerkung;
	}
}
```

In der Klasse Reservierung muss aber toString vorhanden sein ... 
Langsam gehen mir die Ideen aus ...


----------



## VfL_Freak (14. Mai 2014)

Slaid hat gesagt.:


> Cannot make a static reference to the non-static method toString() from the type Reservierung


Die Meldung sagt doch alles !
Deine eigene Methode "toString" (ist übrigens keine gute Idee, sie so wie eine Standardfunktion zu benennen !!!) ist eben nicht als *static*  deklariert !!

Gruß
Klaus


----------



## Slaid (14. Mai 2014)

okay danke erstmal dafür 


Hab die Methode nun so verändert und als static deklariert 

```
public static String ToString() {
		return "gebucht von " + von + " von " + beginn + " bis " + ende 
				+ " für " + bemerkung;
	}
```


aber nun sagt er wieder dass Reservierung x leer ist ... 


```
public String toString() {
		String ret = "";
		if (reservierungen.isEmpty()) {
			ret += "Raum " + geb + "-" + etage + "." + raum;
		}
		else {
			for (Reservierung x : reservierungen) {
				ret += "Raum " + geb + "-" + etage + "." + raum + "\n" +
				Reservierung.ToString(); 
									
			}
		}
		return ret;
	}
```


----------



## Harry Kane (14. Mai 2014)

Was für ein Eiertanz....
Ersetz in der toString()-Methode der Raum-Klasse, genauer in der Schleife über alle für diesen Raum hinterlegten Reservierungen, einfach "reservierung" durch "o".
Die Variable "o" ist eine Referenz auf die aktuelle Reservierung im aktuellen Iterationsschritt, und "reservierung" ist zwar als Instanzvariable deklariert, wird aber nirgends definiert. Deshalb müsste da eine NullPointerException geflogen sein, aus der du (@TE) ein schnödes "//läuft nicht" gemacht hast.
Schmeiss den ganzen Kram mit "Reservierung" (also den Bezug auf die Klasse Reservierung, nicht auf eine bestimmte Instanz) und deine neue statische "ToString" mit großem "T" einfach weg.

Edith hat mich gerade darauf hingewiesen, daß du nach dem Hinzufügen deiner statischen ToString() Methode deine Reservierung-Klasse gar nicht mehr kompilieren können solltest, weil in dieser Methode einige nicht-statische Variable verwendet werden. Von einem solchen Feheler sagst du aber nix. Sehr merkwürdig. Nicht daß jetzt alle in ToString() verwendeten Variablen auch als statisch deklariert sind.


----------



## Slaid (14. Mai 2014)

Danke für die Hilfe 
ich kenn mich halt nicht so gut aus mit dem Kram... bin quasi noch ein Anfänger 

Werd mich da noch mal durchlesen müssen... 
Programm läuft zwar immer noch nicht aber das wird morgen denn so hoffe ich besprochen 

Schönen Abend noch und danke !


----------

