Страницы

Поиск по вопросам

вторник, 26 марта 2019 г.

Как разрешить циклические зависимости в Делфи?

Допустим у нас есть 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 раз.

Комментариев нет:

Отправить комментарий