AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TObjectList<TMyClass> create und inherited

Ein Thema von bcvs · begonnen am 5. Feb 2019 · letzter Beitrag vom 6. Feb 2019
Antwort Antwort
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#1

TObjectList<TMyClass> create und inherited

  Alt 5. Feb 2019, 08:17
Hallo zusammen,

ich bin da auf eine Sache gestoßen und würde gerne wissen, warum das so ist:

Ich habe eine Klasse:

Delphi-Quellcode:
TMyObjectList = class(TObjectList<TMyObject>);
private
...
public
  constructor Create;
  destructor Destroy; override;
end;
Der constructor sah bisher so aus:
Delphi-Quellcode:
constructor TMyObjectList.Create;
begin
  inherited; // <- ohne Create
  // Weiteres Zeugs
end;
Dann habe ich festgestellt, dass das OwnsObjects dieser TMyObjectList false ist, obwohl es ja defaultmäßig true sein sollte. Deshalb gab es jede Menge Speicherlecks. Das Create der Basisklasse wird offensichtlich nicht aufgerufen.

Wenn ich dann das Create so ändere, ist alles in Ordnung:
Delphi-Quellcode:
constructor TMyObjectList.Create;
begin
  inherited Create; // <- mit Create
  // Weiteres Zeugs
end;
Ich hatte bisher immer gedacht, das man das Create nach dem inherited auch weglassen könnte. Bei Override-Methoden ist das ja auch so.
Im Constructor wird aber der originale Contructor anscheinend nicht aufgerufen, wenn man nur inherited schreibt. Es gibt aber auch keine Compilerwarnung. Da muss man schon aufpassen, dass man da nicht drüber stolpert.
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#2

AW: TObjectList<TMyClass> create und inherited

  Alt 5. Feb 2019, 08:32
Das ist doch problemlos möglich, aber eben so
Delphi-Quellcode:
type
  TMyObjectList = class(TObjectList<TObject>)
  public
    constructor Create(AOwnsObjects: Boolean = True);
  end;

constructor TMyObjectList.Create(AOwnsObjects: Boolean);
begin
  inherited;
end;
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#3

AW: TObjectList<TMyClass> create und inherited

  Alt 5. Feb 2019, 10:12
Das kompiliert erst garnicht:

Delphi-Quellcode:
constructor TMyObjectList.Create(AOwnsObjects: Boolean);
begin
  inherited; // <- Inkompatible Typen
end;
egal ob ich Create(AOwnsObjects: Boolean) oder Create(AOwnsObjects: Boolean = True) schreibe
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TObjectList<TMyClass> create und inherited

  Alt 5. Feb 2019, 10:18
Es gibt einen netten Leitspruch: immer, wenn Du mit "inherited" ohne Qualifizierung überschreibst, dann stirbt ein kleines Kätzchen.
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#5

AW: TObjectList<TMyClass> create und inherited

  Alt 5. Feb 2019, 10:27
Ich habe das mit 10.3 Rio ausprobiert und dort funktioniert es wunderbar.
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
702 Beiträge
 
Delphi 12 Athens
 
#6

AW: TObjectList<TMyClass> create und inherited

  Alt 5. Feb 2019, 15:16
Naja, was Du da machst ist den Constructor von TObjectlist<TMyObject> zu ersetzten. Das inherited ruft dann den Constructor in der Vererbungshierarchie auf, der keinen Parameter hat (den gibt es, nämlich den von TList<T>), und nicht den mit dem Parameter OwnsObjects: Boolean = true. Du mußt da explizit

inherited Create(true);

schreiben um den richtigen Constructor zu erwischen.
Peter Below
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#7

AW: TObjectList<TMyClass> create und inherited

  Alt 6. Feb 2019, 07:53
Das ist aber trotzdem etwas verwirrend, denn

inherited create; (ohne Parameter) ruft ja den richtigen Constructor auf, nur inherited; (ohne create) nicht.
Liegt es vielleicht daran, dass das
TObjectlist<TMyObject>.Create(OwnsObjects: Boolean = true); schon einen Parameter hat, man den aber meistens weglässt, weil er per Default true ist?
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
703 Beiträge
 
Delphi 12 Athens
 
#8

AW: TObjectList<TMyClass> create und inherited

  Alt 6. Feb 2019, 08:31
Um die Verwirrung komplett zu machen, habe ich das Ganze mal mit der nicht-generischen TObjectList getestet:

Delphi-Quellcode:
TMyObjectList = class(TObjectList)
private
...
public
  constructor Create;
  destructor Destroy; override;
end;

constructor TMyObjectList.Create;
begin
  inherited; // <- ohne Create
  // Weiteres Zeugs
end;
Ergebnis: Das inherited; (ohne Create, ohne Parameter) ruft hier den richtigen Constructor auf und OwnsObjects ist true;

Wenn man in die Doku schaut, wird die Sache aber auch wieder etwas klarer:

Die nicht-generische TObjectList hat ein Create ohne Parameter:
Delphi-Quellcode:
constructor Create; overload;
constructor Create(AOwnsObjects: Boolean); overload;
Die generische TObjectList hat das nicht:
Delphi-Quellcode:
constructor Create(AOwnsObjects: Boolean = True); overload;
constructor Create(const AComparer: IComparer<T>; AOwnsObjects: Boolean = True); overload;
constructor Create(const Collection: TEnumerable<T>; AOwnsObjects: Boolean = True); overload;
Es ist also offensichtlich ein Unterschied, ob es ein Create ohne Parameter gibt oder ob man bei einem Create(AOwnsObjects: Boolean = True) den Parameter weglässt.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz