AGB  ·  Datenschutz  ·  Impressum  







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

Constructor in der Vererbung

Ein Thema von Captnemo · begonnen am 22. Jul 2014 · letzter Beitrag vom 23. Jul 2014
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

Constructor in der Vererbung

  Alt 22. Jul 2014, 17:00
Hi,

ich habe mir eine Basisklasse erstellt:
Delphi-Quellcode:
type
  TBefehl = class(TObject)
  private
    fGUID: Ansistring;
    constructor Create;
  published
    ...
  public
    ...
  end;
Published und Public hab ich hier mal weggelassen.

Im Constructor Create wird eine GUID erzeugt, die in fGUID gespeichert wird.

Jetzt erstelle ich mir noch eine Klasse aus meiner Basisklasse:

Delphi-Quellcode:
type
  TECHO = class(TBefehl)
  private
    ...
  published
    ...
  public
    ...
  end;
Auch hier hab ich mal die Variablen, Properties, Proceduren und co. weggelassen.

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?
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von FaTaLGuiLLoTiNe
FaTaLGuiLLoTiNe

Registriert seit: 3. Jul 2004
Ort: NRW
55 Beiträge
 
Delphi XE Enterprise
 
#2

AW: Constructor in der Vererbung

  Alt 22. Jul 2014, 17:08
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.
Christian
<< FaTaLGuiLLoTiNe >>
Rhinoceroses don't play games!

Geändert von FaTaLGuiLLoTiNe (22. Jul 2014 um 17:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Constructor in der Vererbung

  Alt 22. Jul 2014, 17:11
Ist ein privater Konstruktor nicht an sich schon ziemlich sinnentleert?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Constructor in der Vererbung

  Alt 22. Jul 2014, 17:12
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.

Noch am Rande: Warum ist fGuid ein String und keine TGUID?
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#5

AW: Constructor in der Vererbung

  Alt 22. Jul 2014, 17:20
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.
So hatte ich das auch gelesen. Also innerhalb der gleichen Unit sollte das ja gehen.
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.

Noch am Rande: Warum ist fGuid ein String und keine TGUID?
Weil ich im Grunde innerhalb meiner Objecte irgendeinen eindeutigen Namen brauchte, den aber als Ansistring. Hätt natürlich auch als TGUID machen können. Aber dann hätt ich sooft umwandeln müssen, also gleich als String;
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo

Geändert von Captnemo (22. Jul 2014 um 17:26 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Constructor in der Vererbung

  Alt 22. Jul 2014, 17:23
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#7

AW: Constructor in der Vererbung

  Alt 22. Jul 2014, 17:39
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#8

AW: Constructor in der Vererbung

  Alt 22. Jul 2014, 17:55
Na klar

Unit BABClasses:
Delphi-Quellcode:
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.
Unit Main:
Delphi-Quellcode:
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;
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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo

Geändert von Captnemo (22. Jul 2014 um 18:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#9

AW: Constructor in der Vererbung

  Alt 22. Jul 2014, 19:00
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie
Online

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: Constructor in der Vererbung

  Alt 23. Jul 2014, 10:44
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.
In der Unit Main ist der Konstruktor von TBefehl nicht sichtbar, wenn er private ist. Daher bleibt dort nur die Möglichkeit, den Konstruktor von TObject aufzurufen, der ja immer verfügbar ist. Auch wenn, TEcho in derselben Unit gewesen wäre, hätte das nichts geändert. Denn auch dann wäre der Konstruktor nicht sichtbar gewesen, da er ja Teil von TBefehl ist.

Private sollte man grundsätzlich nur Member machen, die nur innerhalb dieser Klasse benutzt werden.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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