Onde construtores virtuais são usados?
-
08-07-2019 - |
Pergunta
Eu li sobre construtores virtuais usados para implementar alguns padrões de design, mas não entendi nenhuma necessidade de construtores virtuais.Então, o que são construtores virtuais e por que realmente precisamos deles?
Solução
Na maioria das linguagens de programação, infelizmente, você não consegue encontrar construtores virtuais.Quais substituições de membros virtuais são avaliadas em tempo de execução após a construção de um objeto, mas na maioria das linguagens você precisa conhecer a classe real ao construir a instância.Portanto, os construtores virtuais não fazem sentido nessas linguagens.
No .NET, você pode obter uma solução semelhante por meio de reflexão, ou seja,você pode construir um objeto por meio de uma instância da classe Type que representa o objeto que deseja construir.E com suporte genérico, você também pode conseguir algo semelhante, mas não são construtores virtuais.
A única linguagem de programação com a qual trabalhei que possui verdadeiros construtores virtuais é Delphi.No Delphi, existe um "tipo de metaclasse" específico, ou seja,uma construção de programação específica que representa uma metaclasse (enquanto em .NET, a metaclasse, o Type
class, é apenas uma instância de uma classe normal).Então, se você tem uma classe chamada TMyClass
- Convenções de nomenclatura Deplhi;)
TMyClass : Class ...
Você pode declarar a metaclasse assim
TMyMetaClass : class of TMyClass
Agora, você pode declarar uma variável que seja de TMyMetaClass
tipo,
MyMetaClassVariable : TMyMetaClass
...
// Assign the meta class to refer to our concrete class
MyMetaClassVariable := TMyClass;
E você pode construir uma nova instância através desta variável
MyClassInstance := MyMetaClassVariable.Create();
Agora o MyMetaClassVariable
pode se referir a qualquer classe que seja TMyClass
ou uma especialização deste.Se o construtor for declarado virtual, a variável será construída com uma instância dessa classe específica.
Da mesma forma, você pode declarar métodos estáticos virtuais no Delphi e chamá-los por meio de uma instância da metaclasse.
Então a outra pergunta?Por que nós precisamos deles?Bem, no Delphi, eles resolvem alguns dos mesmos problemas que o Type
classe no .NET, permitindo construir objetos onde você não conhece o nome da classe em tempo de design.Por exemplo, quando você cria um formulário e coloca vários controles, esses dados precisam ser serializados pelo designer e desserializados.Quando o formulário é desserializado, na verdade são os metatipos que são lidos e as instâncias corretas (sejam TextBox
, ComboBox
, etc) são construídos chamando o construtor virtual no metatipo.