3

Вопрос: Я хочу разделить два класса на свой собственный файл, избегая при этом круговых ссылок.Delphi: как перемещать класс из единицы, избегать циркулярных ссылок

У меня есть единица с некоторыми классами (и некоторые перечисления и константы). Любой распознает Click and Clack the tappet brothers:

unit Cartalk; 

interface 

type 
    TSolution = (solTransmission, solBrakes, solGremlins); 

    TTappetBrother = class(TObject) 
    public 
     function GetSolution: TSolution; virtual; abstract; 
    end; 

    TClick = class(TTappetBrother) 
    public  
     function GetSolution: TSolution; override; 
    end; 

    TClack = class(TTapperBrother) 
    public 
     function GetSolution: TSolution; override; 
    end; 

implementation 

function TClick.GetSolution: TSolution; 
begin 
    Result := solTransmission; 
end; 

function TClack.GetSoltution: TSolution; 
begin 
    Result := solGremlins; 
end; 

end. 

Теперь, очевидно, мои два класса TClick и TClick являются довольно сложными. Для управляемости я хотел бы разделить TClick и TClack на свои собственные устройства , не нарушая существующий внешний код.

Моя первая трещина на него будет:

unit Cartalk; 

interface 

uses 
    Cartalk_Click, Cartalk_Clack; 

type 
    TSolution = (solTransmission, solBrakes, solGremlins); 

    TTappetBrother = class(TObject) 
    public 
     function GetSolution: TSolution; virtual; abstract; 
    end; 

    TClick = Cartalk_Click.TClick; //alias brought in from Cartalk_Click.pas 

    TClack = Cartalk_Clack.TClack; //alias brought in from Cartalk_Clack.pas 

implementation 

end. 

Отлично, у меня есть все те же классы, доступные в Cartalk.pas, теперь я просто должен написать Cartalk_Click.pas и Cartalk_Clack.pas:

unit Cartalk_Click; 

interface 

type 
    TClick = class(TTappetBrother) 
    public  
     function GetSolution: TSolution; override; 
    end; 

implementation 

function TClick.GetSolution: TSolution; 
begin 
    Result := solTransmission; 
end; 

end. 

Проблема, конечно, заключается в том, что TTappetBrother и TSolution не объявлены в этом устройстве. Таким образом, мы добавим ссылку туда, где они живут на uses, смотреть это не получится, и достичь сердца моего вопроса:

unit Cartalk_Click; 

interface 

uses 
    Cartalk; 

type 
    TClick = class(TTappetBrother) 
    public  
     function GetSolution: TSolution; override; 
    end; 

implementation 

function TClick.GetSolution: TSolution; 
begin 
    Result := solTransmission; 
end; 

end. 

Существует теперь циклическая ссылка между Cartalk и Cartalk_Click.

Примечание: Конечно, у меня нет блока Cartalk, с Click и Clack братьями-тапперами - это всего лишь пример. На самом деле у меня есть 3 класса, 20 перечислений и 293 константы в моей группе.

+0

«Толкатель» (например, «постучите по нему») Братья. Just sayin ' –

+0

** Редактировать **: Исправлена ​​одна опечатка толкателя. –

+1

Добавление единицы в предложение 'uses' в каждом блоке в нескольких проектах слишком сложно? –

ответ

5

Написать блок:

unit Tappet; 

interface 

type 
    TSolution = (solTransmission, solBrakes, solGremlins); 

    TTappetBrother = class(TObject) 
    public 
     function GetSolution: TSolution; virtual; abstract; 
    end; 

implementation 

end. 

и использовать его в Click и Clack единиц. Затем напишите блок CarTalk, чтобы использовать все три и экспортировать необходимые типы в свой интерфейс. Никаких круговых ссылок не требуется.

+0

Это решение, я думаю. «Экспортировать нужные типы», я предполагаю, что вы имеете в виду «TClick = class (Click.TClick);»? –

+0

Более или менее. Вам не нужно ключевое слово 'class'. Это просто сглаживание, как сделано в вопросе. –

+0

Как вы экспортируете константы? –

 Смежные вопросы

  • Нет связанных вопросов^_^