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