Общие вспомогательные классы в Delphi

У меня есть пара классов, 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. Идеальное решение не исключает этих отношений. Я также предпочитаю один класс на единицу, а не комбинирование связанных классов в отдельные единицы.

благодаря

delphi,generics,helper,

0

Ответов: 1


0 принят

Эта ошибка довольно понятна

 TGenericHelper<T1, T2> = class helper for T2  //Error: Type parameters not allowed

Вы не можете использовать дженерики, подобные этому. Причина должна быть очевидной, потому что ваша реализация пытается получить доступ к переменным, принадлежащим определенному классу, прежде чем вы создадите общий класс (делая реализацию неэквивалентной).

Проще всего сделать, чтобы положить A / B (и C / D и т. Д.) В один блок и просто использовать форвардные объявления для классов.

unit ABCD;

interface

    TB = class;
    TC = class;
    TD = class;

    TA = class(TObject)
      public
        B: TB;
        C: TC;
    end;

    TB = class(TObject)
       public
         A: TA;
    end;

    TC = class(TObject)
      public
        B : TB;
        D : TD;
    end;

    TD = class(TObject)
      public
        A: TA;
        C: TC;
    end;

implementation

end.
Дельфы, дженерики, помощник,
Похожие вопросы