Циркулярная ссылка на классы, которые используют друг друга

У меня есть следующие два класса:

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, который содержит то, что должно быть доступно извне, и сделайте ваши ссылки на это. Это скорее головная боль, но позволяет вам делать это в нескольких единицах.

Другие вопросы по тегам