Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Wozu ist eigentlich constructor gut?


Hein Blöd - Mo 04.12.06 12:51
Titel: Wozu ist eigentlich constructor gut?
Das gleiche gilt für destructor. Irgendwie verstehe ich den Sinn nicht wieso ich hier constructor und da destructor schreiben soll. Und wieso nicht einfach procedure?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
constructor TIrgendwas.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Width := 20;
  Height := 20;
end;


Wieso reicht es nicht einfach das zu schreiben?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TIrgendwas.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Width := 20;
  Height := 20;
end;


Also inherited rufe ich sowieso auf. Was passiert zusätzlich bei constructor? Und wenn da was passiert, wieso muß ich noch inherited schreiben? Das ist ja eine doppelte Pflege. Wiso wird das nicht in einem Rutsch miterledigt?


mkinzler - Mo 04.12.06 13:11

Der Konstruktor dient zum Erzeugen des Objekts, und hat deshalb eine andere Aufgabe wie die Prozeduren/Funktionen.


Stefan.Buchholtz - Mo 04.12.06 13:28

Konstruktor und Destruktor sind spezielle Methoden: Der Konstruktor erzeugt ein Objekt, der Destruktor zerstört es wieder.
Die meisten OOP-Sprachen haben eine festgelegte Syntax um Konstruktor und Destruktor zu festzulegen. In C++ hat beispielsweise der Konstruktor immer den gleichen Namen wie die Klasse selbst und der Destruktor den Klassennamen mit einer vorangestellten Tilde. Bei Object Pascal sind es eben die Schlüsselwörter constructor und destructor.

Stefan


Allesquarks - Mo 04.12.06 13:36

Normalerweise werden deine lokalen Variablen einfach auf dem Stack abgelegt und verlieren ihre Gültigkeit nach verlassen der Prozedur. Natürlich kann man auch globale nehmen.
Der Kasus knaxus aber ist (Grundlage der Objektorientierten Programmierung): Man möchte verschieden viele Objekte während des Programmes verwenden und weiß zur Kompilierzeit noch gar nicht wie viele. Dann weiß ich aber auch nicht wie viel Speicher ich brauche und muss diesen dynamisch anfordern und natürlich auch wieder freigeben. Dies sind die wesentlichen Punkte, die die Construktoren und Destruktoren ausführen sollen. Die Initialisierung des Objektes ist nicht wirklich Aufgabe des Construktors und kann eine einfache Prozedur sein. Nimm einfach den Standardconstruktor

myobject:=Tmyobject.create;
initialize(myobject);


Stefan.Buchholtz - Mo 04.12.06 16:09

user profile iconAllesquarks hat folgendes geschrieben:
myobject:=Tmyobject.create;
initialize(myobject);


Das halte ich aber für keinen guten Stil. In Object Pascal gehört Speicherallokation und Initialisierung schon zusammen - bei sowas sollte man sich meiner Meinung nach immer an die Konventionen der jeweiligen Sprache halten.

Und wenn man den nun unbedingt eine eigene Initalisierungsmethode haben will, sollte es auch wirklich eine Methode sein. Eine normale Prozedur hat in Objektinterna nichts verloren - man gibt sonst alle Vorteile der OOP auf.

Stefan


Allesquarks - Mo 04.12.06 17:01

meinte auch eine Methode


Hein Blöd - Fr 08.12.06 14:51

Ich danke euch.