Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Basiskonsruktor automatisch aufrufen


perry5 - Di 23.01.07 01:24
Titel: Basiskonsruktor automatisch aufrufen
Hi von C++ bin ich jetzt gewohnt, dass der Basiskonstruktor immer von dem Konstruktor der abgeleiteten Klasse aufgerufen wird.
Ich habe also eine Basisklasse mit 5 Werten, und ungefähr 8 abgeleitete Klassen. Nun sollen die einheitliche Standardwerte haben, das wollte ich halt durch den Basiskonstruktor lösen. In C++ hätte das ja auch funktioniert, aber in Delhpi geht das irgendwie so net, weil die Werte nie gesetzt werden, d.h. ich vermute der Basiskonstruktor wurde nicht aufgerufen.
Jetzt finde ich es aber stilistisch extrem unschön in jeder abgeleiteten Klasse diese Standardinitialisierungen zu schreiben, gibt es also eine bessere Lösung, als in jedem abgeleiteten Konstruktor eine InitValues-Procedure aufzurufen die dass dann erledigen würde?


Sinspin - Di 23.01.07 01:36

zeig mal ein stück von deinen code der nicht geht, oder ein beispiel dessen.


perry5 - Di 23.01.07 01:47

Also, ein Beispiel:
Ich habe eine Klasse, "Basisklasse". Diese hat eine Varaible "Wert".
Dann hab ich die Klasse "Unterklasse" die von "basisklasse" abgeleitet ist.
Im Basisklassen-konstruktor setze ich den Wert von "Wert" auf 5.
Ich habe eine Variable "meineKlasse" von typ Basisklasse, die ich mit einer "Unterklasse" initialisiere. Qausi einfache Polymorphie.
So, wenn ich jetzt von "meineKlasse" eine Funktion aufrufe, hat "Wert" nicht den Inhalt 5.
Meiner Meinung weil nur der konstruktor von Unterklasse aufgerufen wurde, der eignetlich gar nichts macht.


Christian S. - Di 23.01.07 01:56

Wenn der Konstruktor der abgeleiteten Klasse gar nichts macht, dann lasse ihn einfach weg. Wenn Du in der abgeleiteten Klasse den Konstruktor brauchst, dann rufe am Anfang inherited; auf, um den Konstruktor der Basisklasse aufzurufen.


Sinspin - Di 23.01.07 02:02

Ich verstehe worauf du hinaus willst.
Zitat:

Meiner Meinung weil nur der konstruktor von Unterklasse aufgerufen wurde, der eignetlich gar nichts macht.


Glaube ich zwar nicht. Weil er Compiler die Zeile die ich hinzugefügt habe normalerweise selber einfügt. Aber probier es mal so:


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:
26:
27:
28:
29:
type
  TBaseClass = class
  public
    constructor Create;
  private
    Wert: integer;
  end;

  TSubClass = class(TBaseClass)
  public
    constructor Create;
  private
  end;

constructor TBaseClass.Create;
begin
  Wert := 5;
end;

constructor TSubClass.Create;
begin
  inherited// hinzugefügt
end;

procedure DoIt;
var klasse: TBaseClass;
begin
  klasse:=TSubClass.Create;
end;


perry5 - Di 23.01.07 13:41

Ok, danke es scheint zu funktionieren.
Und dieses inheried gibt es nicht nur bei Konstruktoren, sondern ruft allgemein die jeweilige Funktion des Basisobjektes auf, richitg?


Sinspin - Di 23.01.07 16:55

Ja ganz genau. Es wird immer die direkte Vorgängerfunktion aufgerufen. Aber nur dann wen diese identische Parameter hat.


Robinator - Di 23.01.07 17:08

Wenn die parameter nicht identisch sind kann man aber auch einfach


Delphi-Quelltext
1:
inherited Create(Param1, Param2);                    


nutzen

gruss, rob