Laden...

Aggregation!

Letzter Beitrag vor 16 Jahren 16 Posts 2.235 Views
Aggregation!

Hallo ,
ich wollte fragen

wie sieht eine "Aggregation" (UML) in einen CSharp Programm?
ist es wie Folgend ?
Wenn ich sage dass die Klasse "A" enthält eine Klasse" B"



public Class A{

public Class B {

}



}

Danke im voraus

Hallo ,
ich wollte fragen

wie sieht eine "Aggregation" (UML) in einen CSharp Programm?
ist es wie Folgend ?
Wenn ich sage dass die Klasse "A" enthält eine Klasse" B"

Nein, das geht sogar eher in Richtung Komposition und selbst das trifft es noch nicht.

Aggregation sieht eher so aus:


public class Produkt
{
}

public class Inventar
{
   Produkt[] mProdukte;
}

Das ist eine ziemlich klassische 1:n Aggregat-Beziehung. Ein Inventar-Objekt hat eine Beziehung zu n Produkt-Objekten.

Kurzer Exkurs zum Unterschied Aggregat und Komposition: Bei der Komposition ist die Beziehung unter den Objekten viel staerker bindend. Beispielsweise Auto und Motor. Ein Auto-Objekt kann zwar ohne ein Motor-Objekt existieren, es kann aber nicht fahren. Ein Aggregat stellt hingegen lediglich eine lose Beziehung zwischen Objekten dar. Ein bestimmtes Produkt(-Objekt) ist im Inventar(-Objekt) enthalten, jedoch nicht fuer dessen funktionsfaehigkeit notwendig.

Ich hoffe, das war einigermassen verstaendlich erklaert und hilft weiter.

Gruesse,

N1ls

Aggregation:

public class A : IDisposable {
  // der Code
}

public class B {
  private A _a; // Aggregation 0..1
  private A[] _as; // Aggregation 0..*
}

Komposition:

public class A : IDisposable {
  // der Code
}

public class B {
  private A _a; // Komposition
  
  public B() {
    _a = new A();
  }

  ~B() {
    // Class A darf ohne Class B nicht existieren .. also man könnte an sich den GC auch noch starten
    _a.Dispose();
    _a = null;
  }
}

  
    // Class A darf ohne Class B nicht existieren .. also man könnte an sich den GC auch noch starten  
  

Ich haette beinahe widersprochen, muss aber zugeben, dass sich die Aussage mit meinen Recherchequellen deckt.

Nach neuem Wissensstand muss ich dann aber hinzufuegen:

Class A darf nur von Class B instanziiert werden koennen (ansonsten waere die Voraussetzung Class A kann nicht ohne Class B existieren verletzt).

Auf jeden Fall Danke Gregor, hat mir auch wieder etwas mehr Klarheit verschafft.

Gruesse,

N1ls

Richtig, die Klasse darf nur von der anderen Klasse aggregiert werden und sonst keinerlei Assoziation zu einer anderen Klasse haben.

Class A darf nur von Class B instanziiert werden koennen (ansonsten waere die Voraussetzung Class A kann nicht ohne Class B existieren verletzt).

was man zum Beispiel so 100%ig sicherstellen könnte:


public class ClassB
{
    public interface IClassA
    {
    }

    private class ClassA : IClassA
    {
        public ClassA()
        {
        }
    }

    private readonly ClassA _a = new ClassA();

    public IClassA A
    {
        get
        {
            return _a;
        }
    }
}

ohne interface gehts nur über internal, dann muss man dafür aber praktisch ein eigenes assembly bilden.

loop:
btst #6,$bfe001
bne.s loop
rts

kann ich eine Aggregation zwischen :

**Interface und eine Classe 😗*



Public Class B{

private A _a;

}

public Interface A {


}

Zwischen zwei iInterfaces:



public Interface A {

}


Public Interface X{
private A _a;
}

sind die oberen Beispiel Richtig??

Danke im voraus!

zum ersten würd ich sagen, dass es stimmt.

aber sobald du es geschafft hast, das zweite zu kompilieren, gib mir bescheid. dann kann ich einen compilerbug an MS schicken 🙂 (interfaces können weder fields enthalten noch kann man dort sichtbarkeiten definieren.)

loop:
btst #6,$bfe001
bne.s loop
rts

Hallo ,

anhand das Uml Diagramm im Anhang habe ich folgende Klassen gebastelt:


public class A {}


public Class B{

  A[]  _a {

   get;
    set;

     }

   A  _a {
 
   get;
   set;
     }

}

meine Frage:

Im UML Diagramm Stand beim Aggreagtion ( IF , Then , Else) , wie kann ich diese (IF Then Else ) Struktur im Programm definieren.

Danke im voraus!

Hallo doudi,

vorneweg: Du hast die Aggregation in der falschen Richtung umgesetzt. Im Diagramm ist B in A enthalten. Im Code A in B.

Was repräsentiert Klasse B? Statements? Was repräsentiert Klasse A?

Hallo Gregor, hallo N1ls,

Class A darf ohne Class B nicht existieren

Wikipedia sagt zur Komposition:

Ein Teil kann immer nur genau einem Ganzen zugeordnet sein. Konkret lassen sich daraus die Multiplizitäten ableiten. Teile, die über eine Komposition mit einem Ganzen verbunden sind, dürfen jeweils in höchstens einem (0..1) Ganzen vorkommen.

Der erste Satz unterstütz eure Sicht. Der letzte Satz heißt aber, dass A sehr wohl ohne B existieren darf. A darf nur nicht in mehr als einem B enthalten sein.

herbivore

hallo,
also ,


class Template {

B[] _b{
get;
set;
}

}

class Textbox {
}

was mich interessiert wo muss ich jetzt die (IF THEN ELSE Strukture im Classen oben Definieren??

der Diagramm in bessere version sieht wie Folgend aus :

Hallo doudi,

irgendwie ist es schon schwer, wenn du meine Fragen nicht oder nur halbherzig beantwortest, aber ich vermute, dass mit dem Diagramm folgendes gemeint ist:


class A
{
   B If   { get; set; } // muss != null sein
   B Then { get; set; } // muss != null sein
   B Else { get; set; } // darf null sein
}

herbivore

ich dachte ich habe dein Frage beantwortet mit
A = Template
B= Textbox

Danke im voraus

Hallo Gregor, hallo N1ls,

Class A darf ohne Class B nicht existieren
Wikipedia sagt zur Komposition:

Ein Teil kann immer nur genau einem Ganzen zugeordnet sein. Konkret lassen sich daraus die Multiplizitäten ableiten. Teile, die über eine Komposition mit einem Ganzen verbunden sind, dürfen jeweils in höchstens einem (0..1) Ganzen vorkommen.
Der erste Satz unterstütz eure Sicht. Der letzte Satz heißt aber, dass A sehr wohl ohne B existieren darf. A darf nur nicht in mehr als einem B enthalten sein.

Hallo herbivore,

Hier mal eine weitere Quelle zu dem Thema:

[quote=Christoph Kecher, UML 2.0 - Das umfassende Handbuch (2. Auflage 2006)
Wird das Ganze zerstoert, endet auch die Existenz der Teile. Auf der anderen Seite kann das Ganze in der definierten Form nicht weiterexistieren, wenn ihm auch nur eines der Teile wieder entnommen wird. Um dies zu verhindern, ist das Ganze fuer die Erstellung und Beseitigung der Teile verantwortlich

Aufgrund der starken Verbindung kann ein Teil gleichzeitig nur in in einem Ganzen existieren, weshalb die Multiplizitaet auf Seite des Ganzen immer 1 ist und daher auch weggelassen werden kann

Ich finde die Formulierung ein wenig klarer als bei Wikipedia. Meiner Meinung nach bedeutet es wirklich, dass ein Teil auch autark existieren kann.

Interessant aber auch der erste Absatz. Demnach machen bei einem Kompositum beim Ganzen setter-Methoden fuer die Teile keinen Sinn. Oder sehe ich das falsch?

Gruesse,

N1ls

Hallo N1ls,

Demnach machen bei einem Kompositum beim Ganzen setter-Methoden fuer die Teile keinen Sinn. Oder sehe ich das falsch?

ich würde wie du aus dem Satz

Um dies zu verhindern, ist das Ganze fuer die Erstellung und Beseitigung der Teile verantwortlich.

wie du schließen, dass bei Komposition im engeren Sinne keine Setter erlaubt sind.

Auf der anderen Seite würde ich die Grenze zwischen Komposition und Aggregation nicht als scharfe Linie sehen, sondern als fließenden Übergang. Insofern ist sowieso erlaubt, was in der jeweiligen Situation Sinn macht.

Wenn man das typische Beispiel Auto - Räder nimmt, dann ist das ja mindestens nahe an Komposition dran und wird m.E. durchaus auch als Beispiel für Komposition verwendet. Dabei würde der Satz

Auf der anderen Seite kann das Ganze in der definierten Form nicht weiterexistieren, wenn ihm auch nur eines der Teile wieder entnommen wird.

darauf nicht zutreffen. Zwar ist das Auto solange nicht funktionsfähig, solange ein Rad entnommen wurde. Aber man kann durchaus die Räder wechseln (also Setter verwenden) und nach dem Wechsel funktioniert das Auto wieder.

herbivore

*reinschleich*
Interessantes Thema 🙂
*rausschleich*

If u want to finish first, u have to finish first.