Циркулярная проблема с классами, которые используют друг друга - PullRequest
1 голос
/ 28 марта 2009

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

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».

Как я могу обойти это?

================
UPDATE:

Это вечер пятницы в 9:30 вечера, где я нахожусь, и я был полностью застрял. Всего через МИНУТ после моего поста, вы, люди, спасли день !! (ночь!) СПАСИБО !!

Чувак, я люблю StackOverflow .... ТАК, мой друг в этом сумасшедшем учебном сезоне. :) Спасибо, спасибо, спасибо ...

Ответы [ 3 ]

8 голосов
/ 28 марта 2009

На том же устройстве попробуйте следующее:

TcmTPDataConnector = class(TComponent);


TcmTPDataPanel = class(TcmTPBasePanel)
   ... 
end;

TcmTPDataConnector = class(TComponent)
  ...
end;
3 голосов
/ 28 марта 2009

Еще один вариант - использовать интерфейсы, но я думаю, что в этом случае он будет чрезмерно усиленным.

2 голосов
/ 28 марта 2009

Два варианта:

1) Поместите их в один и тот же блок, внутри него тот же типовой блок. Форвард объявляет TcmTPDataConnector, объявляет другой тип и затем объявляет его. (См. Пост jcinacio)

2) Создайте предка TcmTPDataConnector, который содержит то, что должно быть доступно извне, и сделайте ваши ссылки на это. Это скорее головная боль, но позволяет вам делать это на нескольких устройствах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...