![]() |
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:
, ansonsten wird er erst in der vollständig implementierenden Klasse von welcher Instanzen zugelassen werden sollen auf
strict protected
Delphi-Quellcode:
angehoben.
public
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. |
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:
[edit] Sry, Willkommen in der DP :dp: [/edit]
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; |
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 |
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:
|
AW: Wie verhindere ich effektiv die Instanziierung von abstrakten Klassen?
Zitat:
|
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:
zu haben, die implementierende Unterklasse hebt es dann bei Bedarf auf
strict protected
Delphi-Quellcode:
an.
public
Das bewahrt den Entwickler natürlich immer noch nicht vor dem Fehler, z.B. nur den Konstruktor zu implementieren und auf
Delphi-Quellcode:
anzuheben, eine bislang abstrakte Methode allerdings nicht.
public
|
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 |
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] |
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 14:35 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