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
Benutzerbild von DeddyH
DeddyH

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

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

  Alt 6. Mär 2013, 16: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
 
#2

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

  Alt 6. Mär 2013, 16: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.666 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 6. Mär 2013, 16: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
 
#4

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

  Alt 6. Mär 2013, 16: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.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

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

  Alt 6. Mär 2013, 16: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
Benutzerbild von DeddyH
DeddyH

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

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

  Alt 6. Mär 2013, 17: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.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

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

  Alt 6. Mär 2013, 17: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!
Angehängte Grafiken
Dateityp: png abstract.png (27,3 KB, 24x aufgerufen)
  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 17:02 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