Delphi - Stellen Sie sicher, dass ein Klassenkonstruktor aufgerufen wird

7

Das ist wahrscheinlich eine einfache Frage, aber ich würde gerne wissen, wie man sicherstellt, dass ein Konstruktor einer Klasse aufgerufen wird.

Wenn ich den folgenden Code habe:

%Vor%

Delphi erlaubt dies nicht - 'Kann eine statische Methode nicht überschreiben'.

Was ich tun möchte, ist sicherzustellen, dass das Objekt mit meinem benutzerdefinierten Create-Konstruktor erstellt wird UND das Aufrufen des Ahnen Create-Konstruktors verbietet.

Meine aktuelle Lösung für das Problem besteht darin, einen eindeutig signierten Create-Konstruktor wie folgt zu definieren:

%Vor%

aber der Programmierer könnte möglicherweise die Create () - Methode des Vorfahren aufrufen.

    
Simon 11.07.2011, 05:56
quelle

2 Antworten

14

Sie führen einfach einen Konstruktor mit dem Namen des Vorfahren ein. Sobald Sie das tun, gibt es keine Möglichkeit für den Benutzer, ein TMyObject zu erstellen, das den in TObject eingeführten Konstruktor aufruft. Wenn Sie Code wie folgt verwenden:

%Vor%

Sie verwenden den override -Modifikator in TMyObject.Create nicht, da der Konstruktor des Vorfahren nicht virtuell ist.

Bei Verwendung dieses Schemas ist es für den Benutzer unmöglich, Ihre TMyObject mit einem Konstruktor zu erstellen, der in einen Vorgänger eingefügt wurde. In diesem Fall ist der Vorgänger TObject und der einzige Konstruktor, den es hat, ist TObject.Create . Wenn der Benutzer diesen Code schreibt:

%Vor%

Es ist ziemlich offensichtlich, dass der Konstruktor TMyObject aufgerufen wird, nicht der in TObject eingeführte.

Wenn Sie Angst haben, dass Benutzer durch die Rahmen springen würden, um Ihre Klasse mit dem Konstruktor der Vorfahren zu erstellen, können Sie Ihre Sachen mit der Methode AfterConstruction erstellen. Das ist eine virtuelle Methode, also wird sie auch dann aufgerufen, wenn Ihr Objekt mit einer Klassenreferenz vom Typ eines Vorfahren erstellt wird:

%Vor%     
Cosmin Prund 11.07.2011, 06:07
quelle
6

TObject.Create ist kein virtueller Konstruktor, daher der Fehler.

Die einzige Möglichkeit, wie "andere Programmierer" die angestammte Create-Methode aufrufen könnten, besteht darin, absichtlich durch einige Ringe zu springen, z. B.

%Vor%

, da der neu eingeführte Konstruktor die nicht virtuelle TObject.Create

ausblenden wird

Was Sie wollen, ist wahrscheinlich eher wie folgt:

%Vor%     
Gerry Coll 11.07.2011 06:08
quelle

Tags und Links