Где используются виртуальные конструкторы?

StackOverflow https://stackoverflow.com/questions/1436961

  •  08-07-2019
  •  | 
  •  

Вопрос

Я читал о том, что виртуальные конструкторы используются для реализации некоторых шаблонов проектирования, но я не понимал необходимости виртуальных конструкторов. Так что же такое виртуальные конструкторы и зачем они нам нужны?

Это было полезно?

Решение

В большинстве языков программирования, afaik, вы не можете найти виртуальных конструкторов. Какие переопределения виртуальных членов оцениваются во время выполнения после создания объекта, но в большинстве языков вам нужно знать фактический класс при создании экземпляра. Поэтому виртуальные конструкторы не имеют смысла в этих языках.

В .NET вы можете получить аналогичное решение с помощью отражения, то есть вы можете создать объект через экземпляр класса Type, который представляет объект, который вы хотите построить. И с общей поддержкой вы также можете достичь чего-то похожего, но это не виртуальные конструкторы.

Единственный язык программирования, с которым я работал, имеет настоящие виртуальные конструкторы, это Delphi. В Delphi существует определенный «тип метакласса», то есть конкретная программная конструкция, представляющая метакласс (тогда как в .NET мета-класс, класс Type , является просто экземпляром нормального учебный класс). Так что если у вас есть класс с именем TMyClass - Соглашения об именах Deplhi;)

TMyClass : Class ...

Вы можете объявить метакласс следующим образом

TMyMetaClass : class of TMyClass

Теперь вы можете объявить переменную типа TMyMetaClass ,

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

И вы можете создать новый экземпляр с помощью этой переменной

MyClassInstance := MyMetaClassVariable.Create();

Теперь MyMetaClassVariable может ссылаться на любой класс, который является TMyClass или его специализацией. Если конструктор объявлен виртуальным, тогда переменная будет создана с использованием экземпляра этого конкретного класса.

Таким же образом вы можете объявлять виртуальные статические методы в Delphi и вызывать их через экземпляр метакласса.

Итак, другой вопрос? Зачем они нам нужны? Ну, в Delphi они решают некоторые из тех же проблем, что и класс Type в .NET, позволяя вам создавать объекты, в которых вы не знаете имя класса во время разработки. Например, когда вы разрабатываете форму и добавляете несколько элементов управления, эти данные должны быть сериализованы разработчиком и десериализованы. Когда форма десериализована, тогда фактически считываются метатипы, и правильные экземпляры (будь то TextBox , ComboBox и т. Д.) Создаются путем вызова виртуального конструктора на метатипе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top