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.
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:
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:
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:
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
Was Sie wollen, ist wahrscheinlich eher wie folgt:
%Vor%Tags und Links class delphi constructor