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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top