Допустим у нас есть 2 класса, расположенных в разных юнитах:
TMaster - хозяин собаки, который должен о ней знать
TDog - собака, которая должна знать о своем хозяине
Unit_Master:
uses Unit_Dog;
type TMaster = class
public
Dog: TDog;
end;
Unit_Dog:
uses Unit_Master;
type TDog = class
public
Master: TMaster;
end;
Использование таких прямых ссылок между классами очень облегчило бы жизнь. К сожалению, Delphi не может скомпилировать такой код из-за циклической зависимости между юнитами.
Как грамотно разрулить циклическую зависимость и скомпилировать подобный код, какие есть способы?
Ответ
Вариант №4
Использовать помощники классов.
(Способ через private официально перестал работать с Delphi Seattle (но есть пути как обойти: https://stackoverflow.com/questions/37351215) и, вероятно, можно будет перейти на protected)
Unit_Helper:
uses Unit_Master, Unit_Dog;
type
TMasterHelper = class helper for TMaster
private
function GetDog: TDog;
procedure SetDog(aObject: TDog);
public
property Dog: TDog read GetDog write SetDog;
end;
TDogHelper = class helper for TDog
private
function GetMaster: TMaster;
procedure SetMaster(aObject: TMaster);
public
property Master: TMaster read GetMaster write SetMaster;
end;
function TMasterHelper.GetDog: TDog;
begin
Result := fDog;
end;
Unit_Master:
type TMaster = class
protected
fDog: TObject;
end;
uses Unit_Helper;
.. Dog.Bark;
Unit_Dog:
type TDog = class
protected
fMaster: TObject;
end;
uses Unit_Helper;
.. Master.Yell;
Минусы в том, что у класса может быть максимум 1 помощник, следовательно воспользоваться этим трюком можно только 1 раз.
Комментариев нет:
Отправить комментарий