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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top