VirtUX писал(а):property ChildMethod: TObjProcedure;
Это те же обработчики событий, типа TButton.OnClick, которые используется во всех LCL/VCL контролах. Проверено временем, правда используется в основном там, где нужно устанавливать нужный метод извне.
VirtUX писал(а):А как (этот пустой) потом вызывать в родительском?
Прямо так и вызывать, именно для этого и существуют виртуальные методы. Надеюсь, никого не обижу если напомню основную фишку виртуальных методов:
- Код: Выделить всё
TParent = class
procedure ChildMethod; virtual; // пустой, если лень писать begin end;
// можно написать abstract; после virtual.
end;
TChild = class(TParent)
procedure ChildMethod; override;
end;
Теперь если сделать так:
- Код: Выделить всё
var
obj: TParent;
begin
obj := TChild.Create;
obj.ChildMethod();
FreeAndNil(obj);
end;
То будет вызван именно TChild.ChildMethod, несмотря на то, что переменная типа TParent. Это потому, что метод определяется не по объявленному в var типу, а по реально созданному, т.е. чей конструктор мы вызывали. Виртуальные методы сделаны именно для описываемой цели. Другое дело, что топикстартер, зная об этом, почему то сознательно не хотел этот способ использовать, о чём и предупредил. Поэтому ему я не предлагал.
VirtUX писал(а):А если этих методов несколько (в дочернем)?
Можно создавать для каждого виртуальный метод в родителе, а можно вообще отказаться от такого наследования. Наследование по сути -- лишь способ повторного использования функциональности без дублирования кода. Если у потомков одного родителя настолько разная функциональность, что не хочется объединять её в родителе, то может и ну его?
VirtUX писал(а):И если неизвестно заранее сколько этих методов (дочерних) нужно будет вызвать в родительском?
Если неизвестно на этапе проектирования родителя, т.е. родитель после окончания и заморозки своего кода должен будет вызывать произвольное количество неизвестных ему методов, то наверное только на основе списка таких обработчиков, которые вы описали несколькими постами выше.
Вообще, есть две мысли:
1) Реальный пример лучше бы помог найти хорошее решение. Пока мы рассуждаем на TParent и TChild со стороны всё кажется элементарным, логично решающимся с помощью виртуальных методов.
2) Оффтоп: для случаев, когда "заранее неизвестно", у кого, чего и сколько вызвать, Pascal -- не самый эффективный язык. Строгая типизация и проверки до рантайма помогают ловить ошибки, но это иногда здорово связывает руки. Возможно для таких частей системы стоит взглянуть на что-нибудь динамическое, типа Lua.