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
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.
- 1. Funciones virtuales en constructores, ¿por qué los idiomas son diferentes?
- 2. ¿Por qué las funciones virtuales en C++ se llaman 'virtuales'?
- 3. ¿Se heredan los destructores virtuales?
- 4. donde se define Enum.values ()?
- 5. donde se encuentra gacutil.exe?
- 6. Las variantes se usan recursivamente?
- 7. constructores
- 8. hosts virtuales DocumentRoot no se ha modificado
- 9. Mejorar __init__ donde args se asignan directamente a los miembros
- 10. ¿Los modelos de vista se usan en los rieles?
- 11. máquinas virtuales
- 12. ¿Los constructores protegidos se consideran buenas prácticas?
- 13. propiedades virtuales
- 14. ¿Cómo se usan las matrices débiles?
- 15. ¿Por qué se usan campos ocultos?
- 16. ¿Cómo se usan los marcos de CSS?
- 17. ¿Qué protocolos se usan para PING?
- 18. ¿Cómo se usan DVCS en equipos grandes?
- 19. Se rechazarán las aplicaciones que usan telprompt
- 20. ¿Por qué se usan clases estáticas?
- 21. ¿Cómo se usan los marcadores en vi?
- 22. Constructores Groovy
- 23. ¿Múltiples constructores en python?
- 24. Assembly.GetCallingAssembly() y constructores estáticos?
- 25. C++: funciones virtuales privadas, frente a las funciones virtuales puras
- 26. Tablas de métodos virtuales
- 27. ¿Por qué SQL Server se ralentiza cuando se usan variables?
- 28. System.StackOverflowException, cuando se establece ¿Se usan las propiedades?
- 29. Cómo comparar máquinas virtuales
- 30. Donde usa Google C#
La sintaxis de Delphi es correcta. –
@Gamecat - gracias, eliminé mi "exención de responsabilidad";) No hay necesidad de eso como ruido entonces. – Pete
En realidad, es 'TMyClass = class', es decir' '' 'y no': '. –