Циркулярная проблема с классами, которые используют друг друга
-
22-08-2019 - |
Вопрос
У меня есть следующие два класса:
TcmTPDataPanel = class(TcmTPBasePanel)
Database: TnxDatabase;
Session: TnxSession;
private
FDataConnector: TcmTPDataConnector;
MyNxDataBase: TnxDatabase;
MyNxSession: TnxSession;
MyRefNxDataBase: TnxDatabase;
protected
procedure Disconnect; virtual; abstract;
procedure Refresh; virtual;
procedure Requery; virtual; abstract;
public
procedure Connect;
published
property DataConnector: TcmTPDataConnector read FDataConnector write
FDataConnector;
end;
TcmTPDataConnector = class(TComponent)
private
FDatabase: TnxDatabase;
FObservers: TList;
FTableForCategories: TnxTable;
FTableForItemCategoryLinks: TnxTable;
FTableForItems: TnxTable;
procedure SetTableForItemCategoryLinks(const Value: TnxTable);
protected
procedure IterateObservers;
public
constructor Create;
destructor Destroy; override;
procedure Register(Instance: TcmTPDataPanel);
procedure Unregister(Instance: TcmTPDataPanel);
published
property Database: TnxDatabase read FDatabase write FDatabase;
property TableForCategories: TnxTable read FTableForCategories write
FTableForCategories;
property TableForItemCategoryLinks: TnxTable read
FTableForItemCategoryLinks write SetTableForItemCategoryLinks;
property TableForItems: TnxTable read FTableForItems write FTableForItems;
end;
TcmDataPanel является потомком TFrame (3-го поколения).Он не используется напрямую, а скорее от него происходит множество других составных компонентов.
TcmDataConnector — это компонент, который содержит информацию о подключении к базе данных для этих других компонентов.
Я использую ModelMaker и пытаюсь реализовать шаблон Observer, чтобы несколько «панелей данных» могли автоматически обновляться всякий раз, когда «соединитель данных» меняет состояние.
Вот моя проблема:Кажется, я не могу обойти проблему «циклической ссылки», поскольку каждый класс использует другой в разделе «Интерфейс».Размещение связанной ссылки «использует» в разделе «Интерфейс» не устраняет проблему «необъявленного идентификатора», как и размещение их обоих в одном модуле.Сейчас они находятся в одном блоке (пробовал и в отдельных блоках, и вместе), и получаю "Необъявленный идентификатор:Ошибка TcmTPDataConnector.
Как я могу обойти это?
================
ОБНОВЛЯТЬ:
Сейчас вечер пятницы, 21:30, где я нахожусь, и я совершенно застрял.Всего через МИНУТЫ после моего поста вы СПАСЛИ ДЕНЬ!!(ночь!) СПАСИБО!!
Чувак, я люблю StackOverflow....ТАК, мой друг, в этот сумасшедший сезон обучения.:) Спасибо Спасибо спасибо...
Решение
На том же устройстве попробуйте следующее:
TcmTPDataConnector = class(TComponent);
TcmTPDataPanel = class(TcmTPBasePanel)
...
end;
TcmTPDataConnector = class(TComponent)
...
end;
Другие советы
Еще один вариант — использовать интерфейсы, но я думаю, что в этом случае это было бы переусложнением.
Два варианта:
1) Поместите их в один блок, в один и тот же блок типа.Вперед объявите TcmTPDataConnector, объявите другой тип, а затем объявите его.(См. пост jcinacio)
2) Создайте предка TcmTPDataConnector, содержащего то, что должно быть доступно извне, и сделайте на него ссылки.Это скорее головная боль, но позволяет делать это на нескольких устройствах.