Autor Beitrag
loriot
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 08.04.09 10:41 
Hallo,

ich deklariere in einer Klasse einen constructor, der nichts anderes als die Belegung der private deklarierten Attribute mit den Eingangsparametern (also Werten) machen soll.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
type
  TKuh = class

 private
  Name:string;
  Hungerniveau:integer;
  Gewicht:real;
  Euterfuellstand:real;
  protected

 public

    constructor Erschaffen (N:string;H:integer;G,E:real);
    
end;

implementation

constructor TKuh.Erschaffen(N:string;H:integer;G,E:real);
begin
Name:=N;
Hungerniveau:=H;
Gewicht:=G;
Euterfuellstand:=E;
end;


funktioniert auch.
Nun habe ich gelesen, dass wenn man eigene constructoren schreibt diese "inherited;" bzw. "inherited create;" beinhalten sollten.

Ist dies tatsächlich unbedingt nötig - wenn ja WARUM? bzw. Warum funzt es auch ohne inherited create?

DANKE
loriot
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mi 08.04.09 10:51 
Warum man es tun sollte:
Da mit Inherited die Funktionalität von TObject oder anderen Klassen initialisiert wird, von denen Du ableitest.

Warum es trotzdem geht:
Weil ein wenig Compiler-Magic zumindest einen Großteil von TObject auch so initialisiert.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
loriot Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 08.04.09 11:23 
Danke erstmal BenBE - aber "...MAGIC..." befriedigt natürlich wenig.
Liegt es an der Direktive "constructor" dass der Compiler "weiss" was zu machen ist - also Aufruf des create von TObject?
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Mi 08.04.09 11:35 
Nein.

TObject.create ist schlicht und ergreifend leer

Dass bei einem Konstruktor ein Objekt erzeugt werden soll, kann sich der Compilern zusammenreimen und den entsprechenden Code generieren.

Deshalb ist es - sofern du nur von TObject ableitetst - egal ob du das inherited aufruftst oder nicht da der Aufruf einer leeren Methode wirkunslos ist.

Wenn du es nicht reinschreibst wird TObject.Create auch nicht aufgerufen ;)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 08.04.09 11:57 
Und der Konstruktor heißt standardmäßig Create.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mi 08.04.09 13:42 
user profile iconjfheins hat folgendes geschrieben Zum zitierten Posting springen:
Wenn du es nicht reinschreibst wird TObject.Create auch nicht aufgerufen ;)

Trotzdem sollte man es sich meiner Meinung nach mit angewöhnen..
wenn man von anderen Objekten ableitet, und das inherited aus Gewohnheit vergisst, kann dies spaßige Folgen haben.

_________________
PROGRAMMER: A device for converting coffee into software.
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Mi 08.04.09 13:55 
user profile iconjfheins hat folgendes geschrieben Zum zitierten Posting springen:
Deshalb ist es - sofern du nur von TObject ableitetst - egal ob du das inherited aufruftst oder nicht da der Aufruf einer leeren Methode wirkunslos ist.


Hi,

das gilt auch bei weiteren abgeleiteten Klassen, solange man nicht im constructor irgendwas initialisiert hat, der abgeleitete constructor also ebenfalls leer ist. Inherited create weist den Compiler eben an, diese Initialisierungen der Vorgängerklasse auszuführen. Lässt man es aber weg und fügt später mal "weiter oben" einen Code zur Initialisierung ein, hat man möglicherweise ein Problem, und bei fremder Software fällt man ganz sicher auf die Schnauze.

Create muss der constructor nicht heissen, dass ist nur eine Konvention. Zum Aufruf muss man sowieso nicht nur den Namen wissen, sondern auch die Parameter. Ich verwende z.B. für Konfigurationsdaten einen ganzen Satz constructoren Create_Integer, Create_Bool, Create_String usw. um verschiedene Typen anzulegen.

Gruss Reinhard
loriot Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 17.04.09 11:48 
Vielen Dank an alle!!!
Kurzum: "inherited" ist nur dann nötig, wenn man im Konstruktor einer Oberklasse bereits etwas initialisiert hat - ansonsten nicht. Es ist aber besser es stets zu verwenden, um bei späterer Initialisierung in einer Oberklasse dies nicht nachholen zu müssen.
Viele Grüße