Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Wie verhindere ich effektiv die Instanziierung von abstrakten Klassen? (https://www.delphipraxis.net/173602-wie-verhindere-ich-effektiv-die-instanziierung-von-abstrakten-klassen.html)

Der schöne Günther 6. Mär 2013 16:29

Wie verhindere ich effektiv die Instanziierung von abstrakten Klassen?
 
Liebe Gemeinde,

trotz mehreren Themen bzgl. "Abstrakte Klassen und Delphi" bin ich nach wie vor ratlos, wie man effektiv die Instanziierung von abstrakten Klassen verhindern soll. Der Delphi-Compiler lässt es ja nach wie vor zu.

Hier eine Liste von anderen Themen:

Mir fällt bislang nur eine Möglichkeit ein: Der Konstruktor ist gründsätzlich
Delphi-Quellcode:
strict protected
, ansonsten wird er erst in der vollständig implementierenden Klasse von welcher Instanzen zugelassen werden sollen auf
Delphi-Quellcode:
public
angehoben.

Blöd hierbei ist, dass ich in den konkreten Unterklassen den Konstruktor immer noch einmal überschreiben muss damit er sichtbar wird, auch wenn es im Endeffekt nicht nötig wäre. Das kann man zwar bleiben lassen und mit RTTI-Methoden drumherum kommen, aber unschön ist es trotzdem.


Etwas besseres fällt mir nicht ein. Gäbe es noch andere oder zusätzliche Ideen?


Vielen Dank im Vorraus.

DeddyH 6. Mär 2013 16:35

AW: Wie verhindere ich effektiv die Instanziierung von abstrakten Klassen?
 
Sonderlich schön finde ich es nicht, aber das hier hat unter Delphi 7 funktioniert:
Delphi-Quellcode:
type
  TAbstractClass = class
  public
    constructor Create; virtual;
  end;

  TDings = class(TAbstractClass)
  public
    constructor Create; override;
  end;

...

{ TAbstractClass }

constructor TAbstractClass.Create;
begin
  if ClassName = 'TAbstractClass' then
    raise Exception.CreateFmt('%s darf nicht direkt instanziert werden, benutzen Sie einen Nachfolger.', [ClassName]);
end;

{ TDings }

constructor TDings.Create;
begin
  inherited;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  SomeClass: TAbstractClass;
begin
  SomeClass := TAbstractClass.Create; //Exception
  SomeClass.Free;
  SomeClass := TDings.Create; //alles OK
  SomeClass.Free;
end;
[edit] Sry, Willkommen in der DP :dp: [/edit]

Sir Rufo 6. Mär 2013 16:47

AW: Wie verhindere ich effektiv die Instanziierung von abstrakten Klassen?
 
@DeddyH

Das fällt aber nur im laufenden Betrieb auf, denn der Compiler meckert darüber nicht ... und wenn diese Stelle nicht getestet wurde, dann gute Nacht Marie.

Das ist wohl auch der Grund für die Suche

DeddyH 6. Mär 2013 16:48

AW: Wie verhindere ich effektiv die Instanziierung von abstrakten Klassen?
 
Das ist aber leider das Beste, was mir einfällt, ich kann dummerweise keinen Compiler schreiben :mrgreen:

Sir Rufo 6. Mär 2013 16:50

AW: Wie verhindere ich effektiv die Instanziierung von abstrakten Klassen?
 
Zitat:

Zitat von DeddyH (Beitrag 1206199)
Das ist aber leider das Beste, was mir einfällt, ich kann dummerweise keinen Compiler schreiben :mrgreen:

Da geht es dir wie mir :mrgreen:

Der schöne Günther 6. Mär 2013 16:56

AW: Wie verhindere ich effektiv die Instanziierung von abstrakten Klassen?
 
Im Endeffekt geht es wohl bei Jedem nur darum sicherzustellen, dass die Unterklassen alle bislang abstrakten Methoden vernünftig implementieren wenn sie denn instanziiert werden wollen.
Das geht in Delphi ja anscheinend um keinen Preis. :x

Deshalb war meine Idee, den Konstruktor (und andere abstrakte Methoden) immer
Delphi-Quellcode:
strict protected
zu haben, die implementierende Unterklasse hebt es dann bei Bedarf auf
Delphi-Quellcode:
public
an.

Das bewahrt den Entwickler natürlich immer noch nicht vor dem Fehler, z.B. nur den Konstruktor zu implementieren und auf
Delphi-Quellcode:
public
anzuheben, eine bislang abstrakte Methode allerdings nicht.

mjustin 6. Mär 2013 17:00

AW: Wie verhindere ich effektiv die Instanziierung von abstrakten Klassen?
 
Das gewünschte Verhalten ist ab Delphi 2009 in den IDE Einstellungen vorgesehen und muss nur aktiviert werden:

Code:
Project -> Options

  + Delphi Compiler

     > Hints and Warnings

         + Output Warnings:

              Constructing instance containing abstract method: Error

DeddyH 6. Mär 2013 17:00

AW: Wie verhindere ich effektiv die Instanziierung von abstrakten Klassen?
 
So isses, außerdem kommt ja immerhin eine Compiler-Warnung, wenn man eine Klasse mit abstrakten Methoden instanzieren will.

[edit] @mjustin: Danke für den Tipp, das wusste ich auch noch nicht. [/edit]

Der schöne Günther 6. Mär 2013 17:07

AW: Wie verhindere ich effektiv die Instanziierung von abstrakten Klassen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Großartig, genau so etwas habe ich gesucht. Ich hatte befürchtet, dass es den Compiler nie interessiert, ob eine Klasse alle abstrakten Methoden implementiert hat oder nicht.

Noch einfacher hätte man es finden können über [F6] und "abstrakt" eingeben :)

Vielen Dank für den Hinweis!


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:05 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