Domanda

Ho letto che i costruttori virtuali sono usati per implementare alcuni schemi di progettazione, ma non ho capito alcuna necessità di costruttori virtuali. Quindi cosa sono i costruttori virtuali e perché ne abbiamo davvero bisogno?

È stato utile?

Soluzione

Nella maggior parte dei linguaggi di programmazione, afaik, non è possibile trovare costruttori virtuali. Quale sostituzione di un membro virtuale viene valutata in fase di esecuzione dopo la creazione di un oggetto, ma nella maggior parte dei linguaggi è necessario conoscere la classe effettiva durante la costruzione dell'istanza. Pertanto i costruttori virtuali non hanno senso in questi linguaggi.

In .NET, è possibile ottenere una soluzione simile tramite reflection, ovvero è possibile costruire un oggetto tramite un'istanza della classe Type che rappresenta l'oggetto che si desidera costruire. E con il supporto generico, puoi anche ottenere qualcosa di simile, ma non sono costruttori virtuali.

L'unico linguaggio di programmazione con cui ho lavorato con veri costruttori virtuali è Delphi. In Delphi esiste un tipo specifico di "metaclasse", ovvero un costrutto di programmazione specifico che rappresenta una metaclasse (mentre in .NET la meta classe, la classe Type , è solo un'istanza di una normale classe). Quindi se hai una classe chiamata TMyClass - Convenzioni di denominazione Deplhi;)

TMyClass : Class ...

Puoi dichiarare la metaclasse in questo modo

TMyMetaClass : class of TMyClass

Ora puoi dichiarare una variabile di tipo TMyMetaClass ,

MyMetaClassVariable : TMyMetaClass
... 
// Assign the meta class to refer to our concrete class
MyMetaClassVariable := TMyClass;

E puoi costruire una nuova istanza attraverso questa variabile

MyClassInstance := MyMetaClassVariable.Create();

Ora, MyMetaClassVariable può fare riferimento a qualsiasi classe che sia TMyClass o una sua specializzazione. Se il costruttore viene dichiarato virtuale, la variabile verrà costruita con un'istanza di quella classe specifica.

Allo stesso modo, puoi dichiarare metodi statici virtuali in Delphi e chiamarli attraverso un'istanza della metaclasse.

Quindi l'altra domanda? Perché ne abbiamo bisogno? Bene, in Delphi, risolvono alcuni degli stessi problemi della classe Type in .NET, permettendoti di costruire oggetti in cui non conosci il nome della classe in fase di progettazione. Ad esempio, quando si progetta un modulo e si inseriscono numerosi controlli, questi dati devono essere serializzati dal progettista e deserializzati. Quando il modulo viene deserializzato, in realtà sono i metatipi che vengono letti e le istanze corrette (sia TextBox , ComboBox , ecc.) Vengono costruite chiamando il costruttore virtuale sul metatipo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top