Где используются виртуальные конструкторы? - PullRequest
6 голосов
/ 17 сентября 2009

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

1 Ответ

12 голосов
/ 17 сентября 2009

В большинстве языков программирования, 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 и т. Д.) Создаются путем вызова виртуального конструктора для метатипа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...