Sunday, May 25, 2008

class constructors

Хотелось бы иметь в Delphi for Win32 методы, объявляемые как class constructor, т.е. выполняющую некоторую инициализацию для класса в целом, а не для его экземпляров. И чтобы их код гарантировано выполнялся при старте приложения (подобно секции initialization юнита). И чтобы потомки класса наследовали конструкторы класса предка, а при желании - могли переопределить его поведение. Зачем это нужно? Скажем, у меня есть классы с общим предком, которые я должен регистрировать с помощью RegisterClass. Мне приходится помнить об этом и прописывать код регистрации руками для каждого класса в секции инициализации юнита. А если бы была описанная выше возможность, я мог бы в коде классового конструктора базового класса написать
RegisterClass(Self);
и просто объявлять от класса потомков - они бы регистрировались автоматически. Можно было бы регистрировать даже более сложным образом:
RegisterClassAlias(Self, GetClassAlias);
где GetClassAlias - виртуальный классовый метод. Эх, мечты-мечты...

3 comments:

Anonymous said...

С аналогичной проблеммой столкнулся в этом году, когда писал модуль для сериализации.
При подъеме класса с ресурса приходиться соблюдать порядок выполнения конструкторов подклассов, а также собсна знать адреса и параметры этих конструкторов...
пробовали c:=GetClass('TFont').Create; ?))
выполнится не TFont.Create а TObject.Create - в результате непроинициализированными остаются поля TFont....
Если у Вас уже есть ответ на этот вопрос, прошу помочь ;)
trojanhost@mail.ru

v2 said...

function TBase.New: Pointer;
begin
Self:=Pointer(Self.ClassType.Create);
Result:=Create;
end;

или

class function TBase.New: Pointer;
begin
Result:=Create;
end;

v2 said...

TBase = class
constructor Create; virtual;


TChild = class
constructor Create; override;