![]() |
Constructor in der Vererbung
Hi,
ich habe mir eine Basisklasse erstellt:
Delphi-Quellcode:
Published und Public hab ich hier mal weggelassen.
type
TBefehl = class(TObject) private fGUID: Ansistring; constructor Create; published ... public ... end; Im Constructor Create wird eine GUID erzeugt, die in fGUID gespeichert wird. Jetzt erstelle ich mir noch eine Klasse aus meiner Basisklasse:
Delphi-Quellcode:
Auch hier hab ich mal die Variablen, Properties, Proceduren und co. weggelassen.
type
TECHO = class(TBefehl) private ... published ... public ... end; Grundsätzlich hätt ich jetzt gedacht, meine Klasse TECHO (hat keinen eigenen Constructor) erbt von der TBefehl den Constructor Create, so wie die Klasse TBefehl eben diesen von TObject erbt. Aber, mein Constructor wird nie ausgeführt. Hab ich das falsch verstanden und mache einen Denkfehler? |
AW: Constructor in der Vererbung
Wenn du von ausserhalb deiner Klassenhierarchie TBefehl.Create bzw. TECHO.Create verwendest, dann wird nicht der private Konstruktor der Klasse TBefehl aufgerufen (der ist ja nach aussen auch gar nicht sichtbar), sondern der öffentliche Konstruktor von TObject. Und der macht so ziemlich gar nichts.
Du kannst ja mal probieren, TBefehl.Create zu verwenden (von ausserhalb der Klasse TBefehl). Du müsstest eine Fehlermeldung bekommen. // Edit: Private Konstruktoren machen eigentlich nur Sinn, um von innerhalb derselben Klasse (z.B. in einer Factorymethode) verwendet zu werden. An deiner Stelle würde ich den Konstruktor von TBefehl einfach als public deklarieren und je nachdem auch noch virtuell machen. |
AW: Constructor in der Vererbung
Ist ein privater Konstruktor nicht an sich schon ziemlich sinnentleert?
|
AW: Constructor in der Vererbung
Leider wäre er nur vollkommen sinnentleert wenn Delphi nicht so eine komische Definition von Sichtbarkeiten hätte. "Private" heißt ja nur "Diese Klasse und gleich noch alles in dieser Unit auch". "Strict private" wäre vollkommen sinnentleert. :stupid:
Noch am Rande: Warum ist fGuid ein String und keine TGUID? |
AW: Constructor in der Vererbung
Zitat:
Da TEcho sich in der gleichen Unit befindet, dachte ich, da ich diese aus TBefehl ableite, dass sie auch deren Create verwendet. Die Klasse TBefehl wird in meinem Prog nie direkt erzeugt, sondern dient nur als Basis für anderen Objecte. Aber: Constructor in Public....schon geht's. Gut, dann hab ich das vielleicht nicht ganz richtig verstanden. Wenn ich mein Object TECHO in der gleichen Unit erzeugt hätte, hätte es vielleicht auch so funktioniert. Zitat:
|
AW: Constructor in der Vererbung
Wenn du beide in die gleiche Unit gepackt hast (Igitt!) dann sollte es eigentlich gehen! Kannst du ein reproduzierbares Minimalbeispiel einstellen?
Delphi-Quellcode:
program Project2;
{$APPTYPE CONSOLE} {$R *.res} type TBaseClass = class (*strict*)private constructor Create(); end; TSubClass = class(TBaseClass) // Nichts end; { TBaseClass } constructor TBaseClass.Create(); begin WriteLn('Hallo'); end; begin TSubClass.Create(); ReadLn; end. |
AW: Constructor in der Vererbung
Dein Constructor wird ausgeführt, wenn er an der Stelle des Aufrufs sichtbar ist. (also nur innerhalb der Unit)
PS: in der RTTI gibt es eine Klasse, da wollte Emba unbedingt allen "fremden" den Aufruf des Constructors, bzw. das Erstellen der Klasse verbieten. - Es gibt einen privaten constructor, welcher nur innerhalb der eigenen Unit vom eigenem Code aufgerufen werden kann. - Und es gibt einen public Constructor, in dem nichts Anderes gemacht wird, außer eine Exceptions "nee, DU nicht!" zu werfen. |
AW: Constructor in der Vererbung
Na klar :-)
Unit BABClasses:
Delphi-Quellcode:
Unit Main:
unit BABclasses;
interface uses System.Contnrs, System.Classes, System.SysUtils; type TBefehl = class(TObject) private fGuid: AnsiString; published property Guid: AnsiString read fGuid write fGuid; public constructor Create; end; type TECHO = class(TBefehl) private fText: AnsiString; published property Text: AnsiString read fText write fText; end; implementation constructor TBefehl.Create; var g: TGUID; begin inherited Create; CreateGUID(g); self.fGuid:=GUIDToString(g); end; end.
Delphi-Quellcode:
Ich habs aber mal zusammengekürzt, kann nicht alles hier posten. So aber in etwa. Hier habe ich das Create in Public, und so geht's auch.
unit main;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.ComCtrls, Vcl.Buttons, BABclasses, Vcl.Menus, System.Contnrs; type Tfrm_batchdefinition = class(TForm) lst_test: TListBox; btn_Add: TSpeedButton; procedure btn_AddClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private-Deklarationen } public BefehlsListe: TObjectList; { Public-Deklarationen } end; var frm_main: Tfrm_main; implementation {$R *.dfm} procedure Tfrm_main.FormCreate(Sender: TObject); begin Befehlsliste:=TObjectList.Create; end; procedure Tfrm_main.FormDestroy(Sender: TObject); begin Befehlsliste.free; end; procedure Tfrm_main.btn_AddClick(Sender: TObject); var echo: TECHO; begin echo:=TECHO.Create; lst_temp.items.add(echo.guid); end; |
AW: Constructor in der Vererbung
Wie wäre es, wenn die TObjectList auch noch auf OwnsObject umgestellt wird?
Oder man verwendet stattdessen eine generische TObjektList<TBefehl>, oder eine TCollection, bzw. eine TQueue<TBefehl> usw., welche sich auch um die Freigabe der Objekte kümmern. Statt die Objekte manuell zu erstellen, kann man der Liste auch Funktionen verpassen, welche diese Instanzen intern erstellen und zu sich hinzufügen. |
AW: Constructor in der Vererbung
Zitat:
Private sollte man grundsätzlich nur Member machen, die nur innerhalb dieser Klasse benutzt werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz