Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Der Compiler merkt nicht, dass eine Klasse nicht vollständig implementiert ist (https://www.delphipraxis.net/175350-der-compiler-merkt-nicht-dass-eine-klasse-nicht-vollstaendig-implementiert-ist.html)

Der schöne Günther 14. Jun 2013 12:30

Delphi-Version: XE2

Der Compiler merkt nicht, dass eine Klasse nicht vollständig implementiert ist
 
Folgendes Beispiel:


Header:
Delphi-Quellcode:
type
   TSomeAbstractClass = class abstract
      procedure someAbstractMethod(); virtual; abstract;
   end;
   
   TSomeChildClass = class(TSomeAbstractClass)
      // keine Implementation von someAbstractMethod()
   end;


Implementation
Delphi-Quellcode:
procedure noAbstractError();
type
   TMyClassType = class of TSomeAbstractClass;
const
   myClass: TMyClassType = TSomeChildClass;
var
   myObject: TSomeAbstractClass;
begin

   myObject := myClass.Create(); // Kein Fehler oder Warnung
   myObject := TSomeChildClass.Create(); // Compilerfehler/-Warnung

end;



Was kann ich dagegen tun? Ich möchte einmal oben auf einen Block festgelegt haben, eine Instanz welcher Klasse erstellt wird und nicht in die Falle tappen, aus Versehen Klassen zu instanziieren, die nicht alle Methoden implementiert haben.

Union 14. Jun 2013 12:34

AW: Der Compiler merkt nicht, dass eine Klasse nicht vollständig implementiert ist
 
Nix. Siehe dort
Zitat:

Hinweis: Delphi lässt die Instantiierung einer als abstract deklarierten Klasse aus Gründen der Abwärtskompatibilität zu, aber dieses Feature sollten nicht mehr verwendet werden.

Der schöne Günther 14. Jun 2013 12:37

AW: Der Compiler merkt nicht, dass eine Klasse nicht vollständig implementiert ist
 
Nein, nein.

Ich kann ja mit der Compilerwarnung "Konstruierende Instanz enthält abstrakte Methode" mich ja immerhin davor warnen lassen oder sogar einen Fehler draus machen. Es geht darum, dass der Kerl es (auf dem ersten Weg) überhaupt nicht merkt.

Anhang:

Die Lösung war einfacher als man denkt:
Delphi-Quellcode:
type
    TMyClassType = class of TSomeAbstractClass;
 const
    myClass: TMyClassType = TSomeChildClass;
wird zu

Delphi-Quellcode:
type
    TMyClassType = TSomeChildClass
und alles läuft, wie ich es mir vorgestellt habe.

Stevie 14. Jun 2013 15:11

AW: Der Compiler merkt nicht, dass eine Klasse nicht vollständig implementiert ist
 
Zitat:

Zitat von Union (Beitrag 1218606)
Nix. Siehe dort
Zitat:

Hinweis: Delphi lässt die Instantiierung einer als abstract deklarierten Klasse aus Gründen der Abwärtskompatibilität zu, aber dieses Feature sollten nicht mehr verwendet werden.

Wusste gar nicht, dass das so in der Doku steht - wär besser, wenn sie das Feature endlich implementieren würden. :x

Aber nein, da macht man lieber andere Sachen kaputt, die schon seit 4 Jahren funktionieren...

JamesTKirk 15. Jun 2013 10:07

AW: Der Compiler merkt nicht, dass eine Klasse nicht vollständig implementiert ist
 
Zitat:

Zitat von Stevie (Beitrag 1218621)

Schade, dass ich noch nicht dazu gekommen bin generische Methoden in FPC zu implementieren... sonst würde ich das Beispiel gern mal ausprobieren :mrgreen: (aber ich speichere es mir für die Zukunft mal ab :P )

Gruß,
Sven


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