UML Klassendiagramm - Implementierung einer Aggregation

Hi,

ich habe noch so meine Probleme mit Aggregation und Komposition. Hier mal ein Beispiel:

Die Komposition in der Klasse „Gebäude“ wäre ja dann: Raum einRaum = new Raum();
Bei der Aggregation:

private Student einStudent;
public Vorlesung(Student einStudent) {
this.einStudent = einStudent;

Jetzt aber zu meiner eigentlichen Frage:
Bei meinen Lösungen müsste ja über dem Rautensymbol im UML-Diagramm eine 1 stehen. Bei der Komposition ist ja auch nur eine 1 möglich. Wie realisiert man aber bei der Aggregation z.B. 2?
Die Lösung wird wahrscheinlich recht einfach sein, aber ich komme einfach nicht drauf…

Danke für eure Hilfe!:slight_smile:

Das ist eine Deklartion inkl. Initialisierung und völlig unabhängig von Komposition, Aggregation oder sonstigen? Verstehe nicht auf was Du da hinaus willst.
Aggregation/Komposition beschreiben ja nur die Beziehung zweier Objekte zueinander.

Was für eine 1 und wieso nur eine 1?

Hier steige ich dann völlig aus?
Worauf soll das hinauslaufen?

[QUOTE=_Michael;60965]Das ist eine Deklartion inkl. Initialisierung und völlig unabhängig von Komposition, Aggregation oder sonstigen? Verstehe nicht auf was Du da hinaus willst.
Aggregation/Komposition beschreiben ja nur die Beziehung zweier Objekte zueinander.

Was für eine 1 und wieso nur eine 1?

Hier steige ich dann völlig aus?
Worauf soll das hinauslaufen?[/QUOTE]

Oh, ich dachte, ich habe mich verständlich ausgedrückt… Ich bin noch absoluter Anfänger…
Also, ein Objekt kann ja als Datenfeld andere Objekte in Form einer Komposition und Aggregation enthalten. Mit “Raum einRaum = new Raum()” definiere ich ja ein Objekt in Form einer Komposition. Existiert die Klasse “Gebäude” nicht mehr, so auch nicht mehr das Objekt.
Mit der “1” und “2” meine ich die Kardinalitäten und zwar jene, die im UML-Diagramm auf der “Seite des Rautensymbols” stehen.

Hmm, bin mir zwar immer noch nicht sicher…

Antwort: Mit einer List oder einem Array

[QUOTE=_Michael;60985]Hmm, bin mir zwar immer noch nicht sicher…

Antwort: Mit einer List oder einem Array[/QUOTE]

Aber dann wäre es doch der Fall, der im obigen UML-Diagramm bei der Komposition dargestellt ist. D.h. die Kardinalität der Klasse “Vorlesung” wäre doch immer noch 1, aber die Kardinalität der Klasse Student wäre 2. Ich will aber wissen, wie man den umgekehrten Fall realisiert. D.h. auf der “Vorlesungsseite” eine Kardinalität von zwei. Ich weiß nicht, wie ich es anders erklären sollte. Aber danke auf jeden Fall!

Also eine Vorlesung von 0 bis n Studenten besucht werden kann und ein Student genau an zwei Vorlesungen teilnehmen muss?

Bei meinen Lösungen müsste ja über dem Rautensymbol im UML-Diagramm eine 1 stehen. Bei der Komposition ist ja auch nur eine 1 möglich. Wie realisiert man aber bei der Aggregation z.B. 2?

Warum? So wie es da steht würde ich es folgendermaßen interpretieren:

  1. Gebäude hat mehrere Räume. Kein Raum ist in keinem oder mehreren Gebäuden.

  2. Eine Vorlesung besteht aus mindestens 3 bis unendlich vielen Studenten. Ein Student kann an keiner oder unendlich vielen Vorlesungen teilnehmen.

Siehst du das auch so?

Ich will aber wissen, wie man den umgekehrten Fall realisiert. D.h. auf der „Vorlesungsseite“ eine Kardinalität von zwei. Ich weiß nicht, wie ich es anders erklären sollte. Aber danke auf jeden Fall!

Das hieße, dass ein Student immer an exakt 2 Vorlesungen teilnimmt. Denke nicht, dass es das ist was du willst, also: Was genau willst du?

// Edith: Bei 1) müsste es ganz genau heißen: Gebäude hat 1 oder mehrere Räume.

Es gibt nicht “die richtige” Umsetzung von UML-Assoziationen in Java. Es sind verschiedene Varianten denkbar. Es gibt aber in Java nur bestimmte Mechanismen, überhaupt Referenzen herzustellen:

  • Referenz auf ein einzelnes Objekt direkt mit Variable diesen Typs
  • Referenz auf 0…n Objekte mit Array oder Collection diesen Typs
    Diese beiden Mechanismen können beliebig aufgeteilt werden. Am Beispiel der m:n-Bezieung wären folgende drei Alternativen denkbar:
  • Ein Array/Collection von Studenten in der Vorlesungsklasse. Damit “kennt” die Vorlesung ihre Studenten. Da dieselbe Studenten-Instanz im Array/Collection mehrerer Vorlesungs-Instanzen vorkommen kann, ist hier eine m:n-Beziehung abgebildet
  • Ein Array/Collection von Vorlesungen in der Studentenklasse. Damit “kennt” der Student seine Vorlesungen. Da dieselbe Vorlesungens-Instanz im Array/Collection mehrerer Studenten-Instanzen vorkommen kann, ist hier eine m:n-Beziehung abgebildet.
  • Auf beiden Seiten jeweils Array/Collection der jeweils anderen Klasse. Damit ist die Assoziation von beiden Seiten aus navigierbar. Das macht die Benutzung bequemer, allerdings um den Preis, dass man immer beide Seiten valide halten muss.

Genau, so in der Art! Aber wie realisiere ich die zwei oder auch mehreren Vorlesungen, da ja nach dem Diagramm nur eine Klasse „Vorlesung“ exisiert…
Danke für eure vielen Antworten/Bemühungen!

Das Diagramm macht keine Aussage darüber wieviele Vorlesungen existieren. Bzgl. einer Assoziation zwischen Vorlesung und Studiengang oder Hochschule liegt keine Information vor. Die oben abgebildete Aggregation enthält nur die Aussage, dass ein Student beliebig viele Vorlesungen besuchen kann und eine Vorlesung von mindestens drei Studenten besucht/belegt sein muss.

[QUOTE=Unregistered]Genau, so in der Art! Aber wie realisiere ich die zwei oder auch mehreren Vorlesungen, da ja nach dem Diagramm nur eine Klasse „Vorlesung“ exisiert…
Danke für eure vielen Antworten/Bemühungen![/QUOTE]

Natürlich ist da nur eine KLasse „Vorlesung“. Aber zur Laufzeit erzeugst du damit 3 unterschiedliche Vorlesung- Objekte.