Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verhindern von Instanzierung eines Objekts mit Create (https://www.delphipraxis.net/112610-verhindern-von-instanzierung-eines-objekts-mit-create.html)

warheart 24. Apr 2008 10:35


Verhindern von Instanzierung eines Objekts mit Create
 
Hallo Delphi Gemeinde

Meine erste Frage hier dreht sich um einen relativ komischen Wunsch, nicht so alltäglich.

Ich habe eine Klasse gemacht, die alle Methoden static hat und alle Membervariablen mit class var deklariert hat. Das Ganze ist nach diesem Beispiel von http://dn.codegear.com/article/34324 aufgebaut:
Delphi-Quellcode:
type
  TMyClass = class
    strict private
      class var
        FX: Integer;
    strict protected

    // Note: accessors for class properties must be declared class static.

      class function GetX: Integer; static;
     class procedure SetX(val: Integer); static;
    public
      class property X: Integer read GetX write SetX;
     class procedure StatProc(s: String); static;
  end;

TMyClass.X := 17;
TMyClass.StatProc('Hello');
Nun ist es allerdings immer noch möglich, den Constructor mit Create aufzurufen. Um allen potenziellen Benutzern der Klasse klar zu machen, dass man davon keine eigenen Instanzen machen darf, möchte ich das aufrufen von Create verbieten. Ist das irgendwie möglich? :gruebel:

Beispiel
Delphi-Quellcode:
TMyClass.StatProc('Hello'); // soll funktionieren
myObj := TMyClass.Create; // soll nicht funktionieren
Danke und Gruss an die Welt

s-off 24. Apr 2008 10:37

Re: Verhindern von Instanzierung eines Objekts mit Create
 
Hallo,

anscheinend geht soetwas nicht; hatte das Problem auch schonmal -> hier

Muetze1 24. Apr 2008 12:03

Re: Verhindern von Instanzierung eines Objekts mit Create
 
Schmeiss einfach eine Exception im Konstruktor. Dann wird die Erstellung des Objektes abgebrochen und es ist wie gewünscht.

warheart 24. Apr 2008 12:46

Re: Verhindern von Instanzierung eines Objekts mit Create
 
Das gefällt mir eben auch nicht. Ich möchte wenn schon einen Compiler-Fehler. Weil sonst vergisst plötzlich jemand die Exception ab zu fangen und zu behandeln. Dann gibts plötzlich unschöne Effekte...

Ich habe auch schon mit einem abstrakten Constructor probiert
Delphi-Quellcode:
Constructor Create; virtual; abstract
Das gibt aber eben auch eine Exception und nicht einen Compiler-Fehler.

Bernhard Geyer 24. Apr 2008 12:58

Re: Verhindern von Instanzierung eines Objekts mit Create
 
Zitat:

Zitat von warheart
Das gefällt mir eben auch nicht. Ich möchte wenn schon einen Compiler-Fehler. Weil sonst vergisst plötzlich jemand die Exception ab zu fangen und zu behandeln. Dann gibts plötzlich unschöne Effekte...

Der Entwickler wird doch wohl schon mindestens 1 * seinen Code aufrufen.
Das Problem bei Delphi ist das die abstrakt-Definition nicht bei der Klassendefinition möglich ist sondern nur auf Methodenebene.

warheart 13. Mai 2008 09:47

Re: Verhindern von Instanzierung eines Objekts mit Create
 
Naja, ich habe mich nun entschieden, das ganze anders zu lösen. Und zwar habe ich ein globales Objekt erstellt (wird für Logging verwendet). So kann ich auch sicher sein, dass es das Objekt nur einmal gibt.

Danke jedenfalls für die Kommentare. Gruss

phXql 13. Mai 2008 10:30

Re: Verhindern von Instanzierung eines Objekts mit Create
 
Was passiert, wenn man einen privaten Konstruktor definiert?

// Edit: Ach vergesst es, grad den anderen Thread gesehen und gelesen.. Da wurde ja genau das versucht.

FAlter 27. Mai 2008 21:39

Re: Verhindern von Instanzierung eines Objekts mit Create
 
Hi,

der Thread ist zwar schon etwas älter. aber irgendwie ist mir gerade dazu eine Idee gekommen:

Ein abstrakter Konstruktor kann nicht aufgerufen werden! Das gibt sogar ne Warnung (sowie Exception zur Laufzeit), und mit DDevExtensions wird ein Fehler zur Compilezeit draus ;)

Naja, aber ne bessere Idee hab ich dann doch nicht.

Mfg
FAlter

s-off 28. Mai 2008 07:28

Re: Verhindern von Instanzierung eines Objekts mit Create
 
Zitat:

Zitat von FAlter
Ein abstrakter Konstruktor kann nicht aufgerufen werden! Das gibt sogar ne Warnung (sowie Exception zur Laufzeit), und mit DDevExtensions wird ein Fehler zur Compilezeit draus ;)

Hat wohl den gleichen Effekt wie 'strict private' :?

FAlter 28. Mai 2008 10:36

Re: Verhindern von Instanzierung eines Objekts mit Create
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

ich dachte, es wurde eine Lösung gesucht, die nicht compiliert. Bitte, man muss nur Warnungen als Fehler interpretieren, und das geht mit Hier im Forum suchenDDevExtensions. Siehe Bild.

Mfg
FAlter


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:21 Uhr.
Seite 1 von 3  1 23      

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