Конструкторы Delphi принимают скрытый дополнительный параметр, который указывает на две вещи: нужно ли вызывать NewInstance
и каков тип неявного первого параметра (Self
). Когда вы вызываете конструктор из класса или ссылки на класс, вы действительно хотите создать новый объект, и тип параметра Self
будет фактическим типом класса. Когда вы вызываете конструктор из другого конструктора или когда вы вызываете унаследованный конструктор, экземпляр объекта уже создан и передается как параметр Self
. Скрытый дополнительный параметр действует как флаг Boolean
, который True
для выделения нового экземпляра, но False
для вызовов метода в стиле метода.
Из-за этого вы не можете просто сохранить конструктор в местоположении указателя метода [1] и ожидать, что он будет работать; вызов указателя метода не передаст правильное значение для скрытого дополнительного параметра, и он сломается. Вы можете обойти это, объявив параметр явно и выполнив некоторое приведение типов. Но обычно более желательно и менее подвержено ошибкам использовать метаклассы (ссылки на классы) напрямую.
[1] Это еще одна проблема с вашим кодом. Вы пытаетесь сохранить указатель метода в месте расположения указателя функции. Вы можете сделать это и при этом заставить его работать, но тогда вам нужно будет явно указать объявление Self
, и вам также нужно будет передать метакласс в качестве первого параметра при выделении (а также передать True для неявный флаг). Указатели на методы запекают первый параметр и передают его автоматически. Чтобы сделать все это явным, указатель на функцию, эквивалентный TComponent.Create
, выглядит примерно так:
TComponentCreate = function(Self: Pointer; AOwner: TComponent; DoAlloc: Boolean): Pointer;
Self
является указателем здесь, потому что он может иметь тип TComponentClass
или TComponent
, в зависимости от того, является ли DoAlloc
истинным или ложным.