Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - mehrfacher inherited-Aufruf eines Constructors


Hidden - Do 30.07.15 08:25
Titel: mehrfacher inherited-Aufruf eines Constructors
Hallo,

Ich habe eine Klasse, die in ihrem Constructor einige Werte aus einem String einliest. Davon abgeleitet wird eine Klasse, die Werte aus mehreren Strings auslesen soll, wofür ich mehrfach den geerbten Constructor aufrufen möchte.

Ich habe aus mehreren Quellen zusammengesetzt, dass dieser geerbte Constructor gar kein Objekt erzeugt, sondern nur die geerbten Felder initialisiert.

Stimmt das, oder erzeuge ich hier mehr als ein Objekt, und damit ein Speicherleck da ich nur eine einzige Referenz zurückgebe?
In dem Fall müsste ich den mehrfach auszuführenden Code aus dem Constructor auslagern.


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:
30:
TTag = class  // abstract class, but it implements Find()
private
  FKeyword: String;
public
  constructor Find(const S: Stringout p, q: Integer); virtual;
  // p and q are the start and end positions at which FKeyword was found
  // FKeyword will be set by child Classes before the call to inherited
end;

{..}

TMultiTag = class (TTag)
  constructor Find(const S: Stringout p, q: Integer); override;
end;

{..}

constructor TMultiTag.Find(const S: Stringout p, q: Integer);
begin
  FKeyword := 'String1';
  inherited;
  if p <= 0 then begin
    FKeyword := 'String2';
    inherited;
  end;
  if p <= 0 then begin
    FKeyword := 'String3';
    inherited;
  end;
end;


Grüße,
Daniel


jaenicke - Do 30.07.15 10:09

Ja, das funktioniert schon korrekt so.

Allerdings ist es extrem schlechter Programmierstil. In den Konstruktor gehört ohnehin nur der allernötigste Code. Aber dann auch noch so etwas hineinzupacken... :shock:
Und den Konstruktor anders als Create zu nennen ist auch sehr schlechter Stil und entgegen der Konvention...

Den Automatismus versteht niemand so schnell, der später den Quelltext liest. Du selber vermutlich nach ein paar Jahren auch nicht mehr...