2009-09-17 8 views
6

Leí que los constructores virtuales se usan para implementar algunos patrones de diseño, pero no entendí ninguna necesidad de constructores virtuales. Entonces, ¿qué son los constructores virtuales y por qué realmente los necesitamos?Donde se usan constructores virtuales?

Respuesta

12

En la mayoría de los lenguajes de programación, afaik, no puede encontrar constructores virtuales. La anulación de un miembro virtual se evalúa en tiempo de ejecución después de que se construye un objeto, pero en la mayoría de los idiomas necesita conocer la clase real al construir la instancia. Por lo tanto, los constructores virtuales no tienen sentido en estos lenguajes.

En .NET, puede obtener una solución similar a través de la reflexión, es decir, puede construir un objeto a través de una instancia de la clase Type que representa el objeto que desea construir. Y con soporte genérico, también puede lograr algo similar, pero no son constructores virtuales.

El único lenguaje de programación con el que he trabajado que tiene verdaderos constructores virtuales es Delphi. En Delphi, hay un "tipo de metaclase" específico, es decir, una construcción de programación específica que representa una metaclase (mientras que en .NET, la clase meta, la clase Type, es solo una instancia de una clase normal). Así que si usted tiene una clase llamada TMyClass - Deplhi convenciones de nombres;)

TMyClass : Class ... 

Se puede declarar la metaclase como esto

TMyMetaClass : class of TMyClass 

Ahora, se puede declarar una variable que es de TMyMetaClass tipo,

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

Y puede construir una nueva instancia a través de esta variable

MyClassInstance := MyMetaClassVariable.Create(); 

Ahora, el MyMetaClassVariable puede referirse a cualquier clase que sea TMyClass o una especialización de la misma. Si el constructor se declara virtual, la variable se construirá con una instancia de esa clase específica.

De la misma manera, puede declarar métodos estáticos virtuales en Delphi y llamarlos a través de una instancia de la metaclase.

¿Entonces la otra pregunta? ¿Por qué los necesitamos? Bueno, en Delphi, resuelven algunos de los mismos problemas que la clase Type en .NET, lo que te permite construir objetos donde no se conoce el nombre de la clase en el momento del diseño. Por ejemplo, cuando diseña un formulario y coloca un grupo de controles, el diseñador debe serializar estos datos y deserializarlos. Cuando se deserializa el formulario, entonces en realidad se leen los metatipos y las instancias correctas (ya sea TextBox, ComboBox, etc.) se construyen llamando al constructor virtual en el metatipo.

+0

La sintaxis de Delphi es correcta. –

+0

@Gamecat - gracias, eliminé mi "exención de responsabilidad";) No hay necesidad de eso como ruido entonces. – Pete

+0

En realidad, es 'TMyClass = class', es decir' '' 'y no': '. –