У меня есть пара классов, A и B, которые должны содержать ссылки друг на друга. Это означает, что в интерфейсе используется предложение A, необходимо упомянуть блок B, а интерфейс использует пункт B, должен указать единицу A. Это круговая ссылка в Delphi и не разрешена. Я решаю округлость, используя подход, найденный здесь . В принципе, ссылка A на B присутствует, как ожидалось, но ссылка B на A понижается до ссылки TObject, а B использует вспомогательный класс для перевода ссылки на A в соответствующий тип. Вот фрагменты кода для иллюстрации:
unit A;
interface
uses
B;
type
TA = class(TObject)
public
Name: string;
B: TB;
end;
implementation
end.
unit B;
interface
type
TB = class(TObject)
public
Name: string;
protected
fA: TObject;
end;
implementation
end.
unit BHelper;
interface
uses
A,
B;
type
TBHelper = class helper for TB
private
function GetA: TA;
procedure SetA(Value: TA);
public
property A: TA read GetA write SetA;
end;
implementation
function TBHelper.GetA: TA;
begin
Result := TA(fA);
end;
procedure TBHelper.SetA(Value: TA);
begin
fA := a;
end;
end.
На самом деле у меня есть несколько пар этих классов. Это много вспомогательных классов, и все они делают то же самое. Поэтому я попытался написать общий вспомогательный класс, который можно было бы параметризовать, чтобы помочь классу типа B:
unit GenericHelper;
interface
uses
A,
B;
type
TGenericHelper<T1, T2> = class helper for T2 //Error: Type parameters not allowed
private
function GetA: T1;
procedure SetA(Value: T1);
public
property A: T1 read GetA write SetA;
end;
implementation
function TGenericHelper<T1, T2>.GetA: T1;
begin
Result := T1(fA); //Error: undeclared parameter fA
end;
procedure TGenericHelper<T1, T2>.SetA(Value: T1);
begin
fA := a; //Error: undeclared parameter fA
end;
end.
Моя проблема в том, что я недостаточно знаю об общих классах, чтобы знать, будет ли это работать. Я не знаю, как разрешить ошибки, указанные в коде.
Есть ли способ сделать это?
Полное раскрытие: ситуация на самом деле богаче, чем эта. Пары расположены в иерархиях, таких как ABCD, где A содержит ссылку на B, B содержит ссылки на A и C, C содержит ссылки как на B, так и на D, а D содержит ссылку на C. И это один-ко-многим где A фактически содержит список B, каждый B содержит список C, и каждый C содержит список D's. Идеальное решение не исключает этих отношений. Я также предпочитаю один класс на единицу, а не комбинирование связанных классов в отдельные единицы.
благодаря