Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   assoziationen zwischen objekten (https://www.delphipraxis.net/147319-assoziationen-zwischen-objekten.html)

volf 5. Feb 2010 17:22


assoziationen zwischen objekten
 
hey,


also es gibt bidirektionale und unidirektionale assoziation(sowie kompostion und aggregation).

Aggregation

Delphi-Quellcode:
TPerson = class (TObject)
            Adresse : TAdresse;
            Name   : string[15];
            ...
           public
            constructor Create; virtual;
            procedure Init; virtual;
            procedure SetName (n: string); virtual;
           ...
          end;
Zitat:

Komponenten sind vom Aggregat existenzabhängig
– Erzeugung des Aggregats erzeugt auch die Komponenten
– Löschung des Aggregats löscht auch die Komponenten
richtig verstanden habe ich das nicht. Muss bei einer Aggregation die Komponente in der Klasse als Feld hinzugefügt werden? Man könnte doch die Komponente außerhalb der Klasse irgendwo deklarieren und im z.B. im FormCreate() createn?

Bei einer unidirektional Assoziation müssen dan gegenseitig die Komponenten als Feld hinzugefügt werden oder? wie werden sie dan createt? oder ist das nur bei einer Aggregation so?

mkinzler 5. Feb 2010 17:34

Re: assoziationen zwischen objekten
 
Zitat:

Muss bei einer Aggregation die Komponente in der Klasse als Feld hinzugefügt werden? Man könnte doch die Komponente außerhalb der Klasse irgendwo deklarieren und im z.B. im FormCreate() createn?
Aggegation heisst ja Teil eines Ganzen und vom Ganzen abhängig.
Zitat:

Bei einer unidirektional Assoziation müssen dan gegenseitig die Komponenten als Feld hinzugefügt werden oder?
Nein, unidirektional heisst der eine kennt den anderen, der andere den einen aber nicht.
Z.B. der Normalfall beim Owner. Der Owner kennt sein Eigentum und gibt dieses bei seiner Freigabe mit frei. eine Komponente kennt im Normalfall seinen Owner ab nicht.
Bidirektional heisst, das ein Objekt weiss, wer sein Owner ist.

volf 5. Feb 2010 18:35

Re: assoziationen zwischen objekten
 
Zitat:

Zitat von mkinzler
Zitat:

Muss bei einer Aggregation die Komponente in der Klasse als Feld hinzugefügt werden? Man könnte doch die Komponente außerhalb der Klasse irgendwo deklarieren und im z.B. im FormCreate() createn?
Aggegation heisst ja Teil eines Ganzen und vom Ganzen abhängig.
Zitat:

Bei einer unidirektional Assoziation müssen dan gegenseitig die Komponenten als Feld hinzugefügt werden oder?
Nein, unidirektional heisst der eine kennt den anderen, der andere den einen aber nicht.
Z.B. der Normalfall beim Owner. Der Owner kennt sein Eigentum und gibt dieses bei seiner Freigabe mit frei. eine Komponente kennt im Normalfall seinen Owner ab nicht.
Bidirektional heisst, das ein Objekt weiss, wer sein Owner ist.

ja sollte bidirektional heißen.

Klasse 1:

Delphi-Quellcode:
 TDaten= class
 private
     spielFeld: array [0..3,0..3] of string;
//   function pruefeZeile(pZ:string,pZeile:integer):integer;
 //  function pruefeZeile(pZ:string,pZeile:integer):integer;
 public
 //  procedure setzeFeld(pNr:integer,pAktSpieler:string):boolean;
  // procedure pruefeGewonnen(pAktSpieler:string):boolean;
 end;

Klasse 2:
Delphi-Quellcode:
type
  TSteuerung= class
 private
   dieSpielNr:integer;
   anzahlZuege:integer;
 //  procedure setzeAktSpieler(pAktSpieler:string);
  // procedure erhoeheAnzZuege;
 //  procedure erstelleStatistik(pAktSpieler:string);
     function ermittleSpieler(): string;
 public
        aktSpieler:string;
  // procedure bearbeiteClick(pNr:integer);
  // procedure bearbeiteTaste(pNr:integer);
     procedure NeuesSpiel;
 end;

sagen wir mal zwischen diesen Klassen soll eine bidirektionale assoziation bestehen. könnte jemand die felder ergänzen, die jetzt hinzukommen würden?

mkinzler 5. Feb 2010 18:41

Re: assoziationen zwischen objekten
 
Ein einfaches Beispiel:

Delphi-Quellcode:
TReifen = class;

TAuto = class ( Fahrzeug)
    ReifenLinksVorne, ReifenRechtsVorne,
    ReifenLinksHinten, ReifenRechtsHinten: TReifen;
   ...
end;

TReifen = class
    Auto: TAuto;
    ...
end;
Das Auto kennt seine Reifen und der Reifen weis, zu welchem Auto er gehört

BUG 5. Feb 2010 18:54

Re: assoziationen zwischen objekten
 
Also ich habe es so gelernt:
Aggregation <> Komposition

Aggregation:

Ein Objekt/Entität ist ein Behälter für ein anderes.

Beispiel:
Eine Kaffeetasse aggregiert den Kaffee, dh. man kann Kaffee hineinfüllen oder herausnehmen.
Egal ob / wiviel Kaffee darin ist, es ist immer eine Kaffeetasse.
Der Kaffee wird unabhängig von der Tasse erzeugt und vernichtet.

Komposition:

Ein Objekt/Entität besteht aus einem anderem.

Beispiel:
Eine Kaffeetasse besteht unter anderem aus einem Henkel.
Besitzt sie keinen, ist sie keine Tasse.
Der Henkel wird bei der Erstellung der Tasse erstellt und bei ihrer Erstellung vernichtet.


Die Unterscheidung in uni- bzw. bidirektional ist aber afaik nicht davon abhängig.

So, hoffe, das ist richtig, sonst falle ich bei der Prüfung auf die Nase :mrgreen:

volf 5. Feb 2010 19:06

Re: assoziationen zwischen objekten
 
Zitat:

Zitat von mkinzler
Ein einfaches Beispiel:

Delphi-Quellcode:
TReifen = class;

TAuto = class ( Fahrzeug)
    ReifenLinksVorne, ReifenRechtsVorne,
    ReifenLinksHinten, ReifenRechtsHinten: TReifen;
   ...
end;

TReifen = class
    Auto: TAuto;
    ...
end;
Das Auto kennt seine Reifen und der Reifen weis, zu welchem Auto er gehört

hat es einen bestimmten Grund warum du zweimal TReifen = class; geschrieben hast?

wie createt man jetzt ReifenLinksHinten, ReifenRechtsHinten und Auto?

mkinzler 5. Feb 2010 19:08

Re: assoziationen zwischen objekten
 
Zitat:

hat es einen bestimmten Grund warum du zweimal TReifen = class; geschrieben hast?
Ja, das erste ist die Forward-Deklaration.

Zitat:

wie werden jetzt die klassen createt?
Die Reifen im Konstruktor von TAuto.

volf 5. Feb 2010 19:44

Re: assoziationen zwischen objekten
 
@BUG & mkinzler danke für die antoworten.



Delphi-Quellcode:
Auto.Create;
Auto.ReifenLinksVorne.Create;
Auto.ReifenRechtsVorne.Create;
Auto.ReifenLinksHinten.Create;
Auto.ReifenRechtsHinten.Create;
ist es richtig so?

mjustin 5. Feb 2010 19:47

Re: assoziationen zwischen objekten
 
Zitat:

Zitat von volf
Delphi-Quellcode:
Auto.Create;
Auto.ReifenLinksVorne.Create;
Auto.ReifenRechtsVorne.Create;
Auto.ReifenLinksHinten.Create;
Auto.ReifenRechtsHinten.Create;
ist es richtig so?

Eher würde ich an so etwas denken:

Delphi-Quellcode:
Auto.Create;
Auto.ReifenLinksVorne := TReifen.Create;
...
Auto.ReserveRad := TReifen.Create;
Cheers,

mkinzler 5. Feb 2010 19:50

Re: assoziationen zwischen objekten
 
Nein.

Delphi-Quellcode:
type
  TAuto = class (Fahrzeug)
    ...
    constructor Create;
    destructor Destroy;
    ...
  end;

  constructor TAuto.Create;
  begin
      inherited;
      ReifenLinksVorne := TReifen.Create;
      ReifenRechtsVorne := TReifen.Create;
      ...
  end;

  destructor TAuto.Destroy;
  begin
     ReifenLinksVorne.Free;
     ...
     inherited;
  end:
...

var Auto: TAuto;
   ...

  Auto := TAuto.Create;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz