Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Klassenkonzept (https://www.delphipraxis.net/131766-klassenkonzept.html)

bucada 30. Mär 2009 18:02


Klassenkonzept
 
Hallo,

ich bin noch recht neu in der OOP und habe ein kleines Problem.
Ich möchte innerhalb der Klasse eine Instanz derselben Klasse haben.
Ich habe mir das so gedacht:
Delphi-Quellcode:
 
TPersonenClass = class
   name : String;
   alter : Integer;
   Mutter, Vater : TPersonenClass;
   constructor create(name : String;
                      alter : Integer;
                      Mutter, Vater : TPersonClass);
   end;

implementation
   constructor TPersonClass.create(name : String;
                                   alter : Integer;
                                   Mutter, Vater : TPersonClass);
   begin
     self.name := name;
     self.alter := alter;
     // Was muss ich hier eingeben damit es klappt mit Mutter und Vater?
   end;
Nun möchte ich im Hauptprogramm die Personen benutzen.
Dabei soll beispielsweise nach den Deklarationen von 2 Personen folgendes funktionieren (hoffe ich ;) )
Delphi-Quellcode:
  Person1 := TPersonenClass.create('Peter', 16);
  Person2 := TPersonenClass.create('Anna', 38);
  Person2.Mutter := Person1;
Leider meldet Delphi mir einen Fehler bereits bei der Kreierung der Person 1, dass er hinter 16 ein Komma vermisst.
Ich verstehe leider nicht was ich falsch mache. Es wäre nett, wenn mir jemand erklären könnte woran es liegt, oder mir ein Link auf eine Seite, oder Tutorial geben könnte, wo ich das nachlesen könnte.
Ich habe in der Suche leider nichts gefunden. :( (Vielleicht habe ich aber auch falsche Begriffe eingegeben...)

Vielen Dank im Voraus

quendolineDD 30. Mär 2009 18:19

Re: Klassenkonzept
 
Du verwendest hier das sogenannte Containment. Du hast eine Klasse, welche eine weitere Klasse beinhaltet.
Ich persönlich finde es so nicht gut. Da du ja nun auch wiederum von Vater und Mutter die jeweiligen Eltern benennen musst. Ansonsten bekommst du ja inkonsistente Daten.

Aber sei es drum. Du hast einen Constructor, welcher 4 Parameter erwartet: Den Namen, das Alter und Vater und Mutter.
Im Implementationsteil muss das dann wie folgt lauten:

Delphi-Quellcode:
implementation
   constructor TPersonClass.create(name : String;
                                   alter : Integer;
                                   Mutter, Vater : TPersonClass);
   begin
     self.name := name;
     self.alter := alter;
     self.Mutter := Mutter;
     self.Vater := Vater;
   end;
Dekliniert werden die Personen jeweils wie folgt:
Delphi-Quellcode:
Person1 := TPersonenClass.create('Peter', 16, nil, nil);
  Person2 := TPersonenClass.create('Anna', 38, Person1, nil);
Interessant, dass die Mutter deiner Person2 Peter heißt ;-)

Du solltest dir hier wirklich ein anderes Klassenkonzept aussuchen.

mjustin 30. Mär 2009 18:42

Re: Klassenkonzept
 
Zitat:

Zitat von quendolineDD
Du verwendest hier das sogenannte Containment.

Man könnte es auch einfach 'Baumstruktur' nennen. So wie in Baumkuchen, oder wie in Stammbaum ;)

bucada 30. Mär 2009 20:33

Re: Klassenkonzept
 
Vielen Dank für Eure Hilfe. :)
Ich glaube, ich habe es richtig verstanden. Das mit NIL stellt ja dann quasi einen Zeiger auf die andere Person zur Verfügung, der aber noch nirgendwo zeigt.
Ok, in dem Beispiel müsste es der Zeiger andersherum sein. ;)

quendolineDD 30. Mär 2009 20:49

Re: Klassenkonzept
 
nil entspricht dem C/C++-Derivat null. Es steht für einen leeren Zeiger. Ich nutzte es, da keine Personen für diese Daten zu vergeben waren :-)

guidok 31. Mär 2009 06:50

Re: Klassenkonzept
 
Ich persönlich würde die Namen der Personen nicht im Constructor zuweisen, sondern als normale Propertys implementieren. Du wirst ggf. auch nach dem "Erzeugen" der Person noch einmal einen Namen ändern wollen (falls das eine Stammbaumverwaltung wird und sich der Benutzer mal vertippt hat, z.B.) und dazu brauchst du eh die Propertys.

Namenloser 31. Mär 2009 21:07

Re: Klassenkonzept
 
Kleine Anmerkung zum Stil: Normalerweise wird "self" weggelassen, wenn es nicht unbedingt benötigt wird.

quendolineDD 31. Mär 2009 21:13

Re: Klassenkonzept
 
Hier ist es aber unbedingt notwendig, da die Klassenmember von den Parametern des Konstruktors nicht direkt unterscheidbar sind. Heißen ja beide zB "name".


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:44 Uhr.

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