Роб прав в том, что это действительно странно выглядящий код, который может сбить людей с толку, и перевод вашего кода в процедуру инициализации - хорошая идея.Если вам было интересно, основная цель виртуальных конструкторов - это нечто совершенно иное: упростить поддержку создания объектов в «фабричном» стиле.
Некоторые внешние источники предоставляют данные, которые могут идентифицировать любого потомка базового классаи фабрика использует ссылку на класс и вызывает для нее виртуальный конструктор, определенный в базовом классе.Таким образом, вы получите экземпляр класса-потомка без необходимости жесткого кодирования знания класса-потомка в заводской код.
Если это звучит немного странно, взгляните на файл DFM.У него есть список объектов формы, которые происходят от TComponent, с их опубликованными свойствами.Когда код чтения формы встречает оператор object
, он читает имя класса, ищет его в таблице, которая отображает имена классов на ссылки на классы, и вызывает виртуальную TComponent.Create
для этой ссылки на класс.Это вызывает виртуальный конструктор для фактического класса, и он заканчивается экземпляром компонента этого типа и начинает заполнять его свойства.