Циркулярная ссылка на классы, которые используют друг друга
У меня есть следующие два класса:
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, чтобы несколько "панелей данных" можно было автоматически обновлять всякий раз, когда "Data Connector" изменяет состояние.
Вот моя проблема: я не могу обойти проблему "круговой ссылки", так как каждый класс использует другой в разделе Интерфейс. Размещение связанной ссылки "использует" в разделе "Интерфейс" не устраняет проблему "необъявленного идентификатора", и размещение их обоих в одном блоке также не позволяет. Прямо сейчас они находятся в одном модуле (я пробовал их в отдельных модулях и вместе), и я получаю ошибку "Необъявленный идентификатор: TcmTPDataConnector".
Как я могу обойти это?
================
ОБНОВИТЬ:
Это пятничный вечер в 9:30 вечера, где я нахожусь, и я был полностью застрял. Всего через МИНУТ после моего поста, вы, люди, спасли день!! (ночь!) СПАСИБО!!
Чувак, я люблю Stackru.... ТАК, мой друг в этом сумасшедшем учебном сезоне.:) Спасибо Спасибо спасибо...
3 ответа
На том же устройстве попробуйте следующее:
TcmTPDataConnector = class(TComponent);
TcmTPDataPanel = class(TcmTPBasePanel)
...
end;
TcmTPDataConnector = class(TComponent)
...
end;
Еще один вариант - использовать интерфейсы, но я думаю, что в этом случае он будет чрезмерным.
Два варианта:
1) Поместите их в один и тот же блок, один и тот же блок Тип внутри. Форвард объявляет TcmTPDataConnector, объявляет другой тип и затем объявляет его. (См. Пост jcinacio)
2) Создайте предка TcmTPDataConnector, который содержит то, что должно быть доступно извне, и сделайте ваши ссылки на это. Это скорее головная боль, но позволяет вам делать это в нескольких единицах.