Autor Beitrag
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Do 30.07.15 08:25 
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.

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:
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

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19273
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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...

Für diesen Beitrag haben gedankt: Hidden