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; 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!