Können Sie eine Klassenfunktion haben, die eine Instanz einer Klasse erstellt:
%Vor%und verwenden Sie es dann wie folgt
%Vor%Und wenn ja, wie sieht dieser Funktionscode aus? Verwenden Sie die NewInstance-Methode von TObject und implementieren Sie jedes Mal für jede abgeleitete Klasse neu? Ist es sicherer / besser, den Konstruktor zu verwenden?
Ziel ist es, diesen Ansatz in einem Befehlsmuster zu verwenden und die Befehlsliste mit Klassentypen und einem Empfänger zu laden, z. B .:
%Vor%Der Grund dafür ist, dass einige Befehle per Text / Skript spezifiziert werden und zur Laufzeit aufgelöst werden müssen.
Können Sie eine Klassenfunktion haben, die eine Instanz einer Klasse erstellt?
Ist es sicherer / besser, den Konstruktor zu verwenden?
Konstruktor ist eine Klassenfunktion, die eine Instanz der Klasse erstellt. Stellen Sie einfach:
%Vor%Und du bist gut zu gehen.
Mit dem virtual;
-Teil können Sie denselben Konstruktor von New () für alle untergeordneten Klassen aufrufen.
Was Sie suchen, heißt factory pattern . Es kann in Delphi gemacht werden; So deserialisiert die VCL unter anderem Formulare. Was Sie vermissen, ist der Registrierungs- / Nachschlageteil des Systems. Hier ist die Grundidee:
TDictionary<string, TMyClassType>
implementieren, wobei TMyClassType
als class of TMyClass
definiert ist. Das ist wichtig. Sie benötigen eine Zuordnung zwischen Klassennamen und Klassentypreferenzen. Wenn Sie etwas aus einem Skript instanziieren müssen, tun Sie Folgendes:
%Vor%Sie verwenden die Registrierungstabelle, um die Klassenreferenz vom Klassennamen abzurufen, und rufen den virtuellen Konstruktor für die Klassenreferenz auf, um den richtigen Objekttyp daraus zu ermitteln.
Ja, es ist technisch möglich, eine Instanz aus einer Klassenmethode zu erstellen, einfach den eigentlichen Konstruktor aufzurufen und dann die von ihm erzeugte Instanz zurückzugeben, zB:
%Vor%In diesem Fall ist es besser, den Konstruktor direkt zu verwenden:
%Vor%Eine andere Möglichkeit ist die Verwendung von RTTI. Der folgende Code wird als normale Methode in meiner Klasse ausgeführt, um eine neue Instanz des Objekts mit einer Teilmenge von Elementen zu erhalten, da die Objekte (zusammen mit dem Listenobjekt selbst) wahrscheinlich aus untergeordneten Objekten bestehen und eine Instanz von Das Objekt, in dem die Methode definiert ist, ist nicht gut genug, da es vom gleichen Typ der Instanz sein muss.
d. h.
%Vor%Die Implementierung von GetSubRange wäre etwas wie ...
%Vor%Ich schätze für einige Dinge, dass es ein bisschen OTT sein kann, aber im obigen Design funktioniert es und ist eine andere Alternative, obwohl ich schätze, es ist keine Klassenmethode.
Sie sollten einen Konstruktor verwenden (eine spezielle "Art" der Klassenfunktion). TObject.NewInstance
ist keine geeignete Option, es sei denn, Sie benötigen eine spezielle Speicherzuweisung.
Und in Bezug auf die Execute-Routine der Befehlsliste: Die betroffene Aktion hängt nun vom Typ des Objekts ab. Stellen Sie sich ein Dokument vor, das gleichzeitig öffnen, drucken, einfügen und speichern kann (keine seltsame Annahme), was in dieser Struktur schwer zu implementieren wäre. Ziehen Sie stattdessen in Betracht, Interfaces hinzuzufügen (IOpenDocument, IPasteFromClipboard, IPrintable, ISaveDocument), die in der Tat alle Aktionen einer Dokumenteninstanz sein könnten.
Tags und Links delphi delphi-xe design-patterns