Wo werden virtuelle Konstruktoren verwendet?
-
08-07-2019 - |
Frage
Ich habe gelesen über virtuelle Konstrukteure werden zur Implementierung einiger Entwurfsmuster verwendet, habe aber keine Notwendigkeit von virtuellen Konstruktoren verstanden. Was sind virtuelle Konstruktoren und warum brauchen wir sie wirklich?
Lösung
In den meisten Programmiersprachen, Afaik, können Sie keine virtuellen Konstruktoren finden. Die Überschreibung eines virtuellen Mitglieder werden nach der Erstellung eines Objekts zur Laufzeit bewertet. In den meisten Sprachen müssen Sie jedoch die tatsächliche Klasse kennen, wenn Sie die Instanz konstruieren. Daher machen virtuelle Konstruktoren in diesen Sprachen keinen Sinn.
In .NET können Sie durch Reflexion eine ähnliche Lösung erhalten, dh Sie können ein Objekt über eine Instanz der Typklasse konstruieren, die das Objekt darstellt, das Sie konstruieren möchten. Und mit generischer Unterstützung können Sie auch etwas Ähnliches erreichen, aber es sind keine virtuellen Konstruktoren.
Die einzige Programmiersprache, mit der ich gearbeitet habe und die echte virtuelle Konstrukteure haben, ist Delphi. In Delphi gibt es einen spezifischen "Metaklasstyp", dh ein spezifisches Programmierkonstrukt, das eine Metaklas darstellt (während in .NET, der Metaklasse, die Type
Klasse ist nur eine Instanz einer normalen Klasse). Also, wenn Sie eine Klasse angerufen haben TMyClass
- Deplhi -Namenskonventionen;))
TMyClass : Class ...
Sie können die Metaklasse so deklarieren
TMyMetaClass : class of TMyClass
Jetzt können Sie eine Variable deklarieren, die von entspricht TMyMetaClass
Typ,
MyMetaClassVariable : TMyMetaClass
...
// Assign the meta class to refer to our concrete class
MyMetaClassVariable := TMyClass;
Und Sie können eine neue Instanz über diese Variable erstellen
MyClassInstance := MyMetaClassVariable.Create();
Jetzt die MyMetaClassVariable
kann sich auf jede Klasse beziehen, die entweder ist TMyClass
oder eine Spezialisierung davon. Wenn der Konstruktor virtuell deklariert ist, wird die Variable mit einer Instanz dieser bestimmten Klasse konstruiert.
Auf die gleiche Weise können Sie virtuelle statische Methoden in Delphi deklarieren und sie über eine Instanz der Metaklas aufrufen.
Also die andere Frage? Warum brauchen wir sie? Nun, in Delphi lösen sie einige der gleichen Probleme wie die Type
Klasse in .NET, sodass Sie Objekte konstruieren können, bei denen Sie den Klassennamen zur Entwurfszeit nicht kennen. Wenn Sie beispielsweise ein Formular entwerfen und eine Reihe von Steuerungen einfügen, müssen diese Daten vom Designer serialisiert und deserialisiert werden. Wenn das Formular deserialisiert ist, sind es tatsächlich die Metatypen, die gelesen werden, und die richtigen Instanzen (sei es TextBox
, ComboBox
, usw.) werden konstruiert, indem der virtuelle Konstruktor auf dem Metatype aufgerufen wird.