AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Wie verhindere ich effektiv die Instanziierung von abstrakten Klassen?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie verhindere ich effektiv die Instanziierung von abstrakten Klassen?

Ein Thema von Der schöne Günther · begonnen am 6. Mär 2013 · letzter Beitrag vom 6. Mär 2013
Antwort Antwort
Der schöne Günther

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

Wie verhindere ich effektiv die Instanziierung von abstrakten Klassen?

  Alt 6. Mär 2013, 17:29
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 strict protected , ansonsten wird er erst in der vollständig implementierenden Klasse von welcher Instanzen zugelassen werden sollen auf 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.

Geändert von Der schöne Günther ( 6. Mär 2013 um 17:33 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 6. Mär 2013, 17:35
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 = 'TAbstractClassthen
    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 [/edit]
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
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

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

  Alt 6. Mär 2013, 17:47
@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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 6. Mär 2013, 17:48
Das ist aber leider das Beste, was mir einfällt, ich kann dummerweise keinen Compiler schreiben
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
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

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

  Alt 6. Mär 2013, 17:50
Das ist aber leider das Beste, was mir einfällt, ich kann dummerweise keinen Compiler schreiben
Da geht es dir wie mir
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Der schöne Günther

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

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

  Alt 6. Mär 2013, 17:56
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.

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

Das bewahrt den Entwickler natürlich immer noch nicht vor dem Fehler, z.B. nur den Konstruktor zu implementieren und auf public anzuheben, eine bislang abstrakte Methode allerdings nicht.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#7

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

  Alt 6. Mär 2013, 18:00
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
Michael Justin

Geändert von mjustin ( 6. Mär 2013 um 18:06 Uhr) Grund: die Option ist schon ab Delphi 2009 vorhanden
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#8

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

  Alt 6. Mär 2013, 18:00
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]
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.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

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

  Alt 6. Mär 2013, 18:07
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!
Miniaturansicht angehängter Grafiken
abstract.png  
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 01:32 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