В настоящее время я переписываю бесплатный обучающий симулятор цифровых схем, чтобы добавить инерционность его функциям. Моя проблема в том, как отправлять события в исходные классы, добавляя к ним предварительную разработку. У меня есть что-то вроде этого:
TC1 = class
ID: integer;
Connections : array [integer] of Pin;
function Func1; virtual;
function FuncN;
end;
TC2-1 = class (TC1)
function Func1; override;
function My1Func();
end;
TC2-n = class (TC1)
function Func1; override;
function MyNFunc();
end;
TContainer = class
C1 : TC1;
function ContFunc;
end;
function Container.ContFunc;
begin
c1.Func1;
end;
Теперь это означает, что ContFunc вызывает C2.Func1, как мне хочется, специализируя поведение более 300 компонентов, наследующих форму TC1.
Но теперь я должен добавить некоторые специальные операции (одинаковые для всех потомков компонентов).
из TC1 каждый раз, когда вызывается Func1, и выбирая во время этих операций, если мне нужно
вызывать TC2-n.Func1 или нет (после изменения какого-либо свойства предка TC1.
Есть ли способ сделать это чисто, не меняя всех потомков TC1?
Могу ли я использовать вспомогательный класс (не рекомендуется?) Следующим образом:
TH = class helper of TC1
function Func1 virtual; override;
end;
function TH.Func1;
begin
if x then TC2.Func1 else SaveActionData;
end
Если я добавлю TH, когда TContainer вызовет Func1, кто будет вызван?
Это называется TC2.Func1, а не TH.Func1, как я хотел?
Есть ли способ переопределить потомки методом Func1
без написания вспомогательного класса для какого-либо одного (они будут делать все
одни и те же операции, означающие точно одинаковый код)?
Можно из TH вызвать 300 потомков функций Func1 TC2-n?
Другими словами, я пытаюсь найти способ получить такой вызов с помощью вызова Tcontainer c1.Func1;:
NewFunc1 (равно для всех потомков TC1), которые вызывают TC2.Func1 (отличается для любого потомка TC1).
Кто-нибудь может предложить способ сделать это?