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

StackOverflow https://stackoverflow.com/questions/692173

Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top