Фабрика и Объект

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Ответить
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Фабрика и Объект

Сообщение Brainenjii »

В общем, такая проблема... Имеется управляющий класс (что-то вроде фабрики):

Код: Выделить всё

  Type BManagerClass = Class
    Private
      ...
    Public
      Function BuildItem: TItemClass;
      ...
End;

И есть собственно управляемый класс:

Код: Выделить всё

  Type BItemClass = Class
    Private
      ...
    Public
      ...
End;

Очень хочется иметь в управляемом классе что-то вроде

Код: Выделить всё

...
  Property Manager: BManagerClass Read bManager;
...

т.е. чтобы управляемый объект знал о свойствах фабрики, его создавшей... Но при этом, чтобы обеспечить работу Function BuildItem: TItemClass; мне нужно объявить BItemClass перед BManagerClass. Но тогда BItemClass не будет ничего знать о BManagerClass и желаемое свойство Manager: BManagerClass окажется недоступным...
Как правильно разрешить эту проблему? Сейчас я замещаю кошерную Function BuildItem: TItemClass на Constructor BItemClass.Build(aManager: BManagerClass); что представляется мне не совсем правильным ^_^ Или ситуация, когда BItemClass требует информации о BManagerClass сигнализирует о необходимости пересмотреть структуру классов?
daesher
постоялец
Сообщения: 221
Зарегистрирован: 09.03.2010 21:17:14

Сообщение daesher »

Решение - предварительно объявить BManagerClass так:

Код: Выделить всё

type
BManagerClass = class;

И всё. Только не забудьте потом этот класс окончательно описать
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Спасибо. Как понимаю, для этого метода описание BManagerClass и BItemClass должно быть в одном модуле?
daesher
постоялец
Сообщения: 221
Зарегистрирован: 09.03.2010 21:17:14

Сообщение daesher »

Да, иначе не выйдет. Но с разными модулями есть и другой способ: "циклические сслыки" (правда, в одном из модулей придётся ограничиться секцией implementation).
Ответить