Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.03.15;
Скачать: [xml.tar.bz2];

Вниз

Circular unit reference - как быть?   Найти похожие ветки 

 
jetus   (2009-01-22 12:27) [0]

Ситуация:
Есть два модуля с классами:

Модуль А:
uses
 UnitA;
type
 TClassA = class
 public
   B: TClassB;
 end;

Модуль B:
uses
 UnitB;
type
 TClassB = class
 public
   A: TClassA;
 end;

Естественно, выдаёт ошибку "[DCC Error] UnitA.pas(6): F2047 Circular unit reference to "UnitA.pas""

Как выйти из даной ситуации?


 
Сергей М. ©   (2009-01-22 12:28) [1]

Цитата из стандартной справки:

When units reference each other directly or indirectly, the units are said to be mutually dependent. Mutual dependencies are allowed as long as there are no circular paths connecting the uses clause of one interface section to the uses clause of another. In other words, starting from the interface section of a unit, it must never be possible to return to that unit by following references through interface sections of other units. For a pattern of mutual dependencies to be valid, each circular reference path must lead through the uses clause of at least one implementation section.

In the simplest case of two mutually dependent units, this means that the units cannot list each other in their interface uses clauses. So the following example leads to a compilation error:

unit Unit1;
interface
uses Unit2;
...
unit Unit2;
interface
uses Unit1;
...

However, the two units can legally reference each other if one of the references is moved to the implementation section:

unit Unit1;
interface
uses Unit2;
...
unit Unit2;
interface
...
implementation
uses Unit1;
...

To reduce the chance of circular references, it"s a good idea to list units in the implementation uses clause whenever possible. Only when identifiers from another unit are used in the interface section is it necessary to list that unit in the interface uses clause.


 
jetus   (2009-01-22 12:35) [2]

Такая штука не пройдёт: у меня описание классов идёт на уровне interface.


 
Плохиш ©   (2009-01-22 12:41) [3]


> jetus   (22.01.09 12:35) [2]
>
>

Объедини в один модуль.


 
jetus   (2009-01-22 12:46) [4]

> Объедини в один модуль.

Ничего не даст: описание одного класса всё равно будет выше второго, соответственно, первый второго "видеть" не будет.


 
Плохиш ©   (2009-01-22 12:55) [5]


> jetus   (22.01.09 12:46) [4]

Тогда надо будет ещё прочитать про основы программирования в объект паскаль/делфи, там эта ситуация документирована.


 
Сергей М. ©   (2009-01-22 13:04) [6]


> у меня описание классов идёт на уровне interface


А собссно зачем они все нужны именно там ?


 
jetus   (2009-01-22 13:18) [7]

> А собссно зачем они все нужны именно там ?

А где ж им быть?
Два отдельных больших класса (класс формы и класс управления данными).


 
KSergey ©   (2009-01-22 13:27) [8]

Вообще наличие такой конструкции явно свидетельствует о неудачном дизайне, об который постоянно придется ударяться при развитии приложения. Лучше сразу передизайнить.

Но если сильно хоцца

> jetus   (22.01.09 12:35) [2]
> Такая штука не пройдёт: у меня описание классов идёт на уровне interface.

uses
UnitAB;
type
TClassB = class;

TClassA = class
public
  B: TClassB;
end;

TClassB = class
public
  A: TClassA;
end;


 
Плохиш ©   (2009-01-22 13:28) [9]


> Два отдельных больших класса (класс формы и класс управления
> данными).

Класс управления данными не должен ничего знать о каких-то там формах. Он должен хранить, обрабатывать и выдавать по требованию данные.


 
Плохиш ©   (2009-01-22 13:30) [10]


> KSergey ©   (22.01.09 13:27) [8]

Зачем ты его "опускаешь ниже плинтуса"? Думаешь, он не в состоянии об этом прочитать?


 
Сергей М. ©   (2009-01-22 14:04) [11]


> где ж им быть?


А почему кому-то из них не жить, скажем, в разделе имплементации ?
В виде, например, подключаемого inc-файла ?

Да и см. [9]

Ну а если уж так сильно приспичила глобальность всех классовых деклараций, то для этого придуманы интерфейсы, классы, реализующие эти интерфейсы и собственно интерфейсные объекты как экз-ры этих классов.
Все интерфейсы декларируются в интерфейсном разделе некоего юнита, после чего они становятся доступными ищз любого юнита проекта (и даже за пределами проекта при соблюдении определенных соглашений)



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2009.03.15;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.07 c
2-1232537796
fenix96
2009-01-21 14:36
2009.03.15
вывод в StringGrid


15-1231322740
Пронин
2009-01-07 13:05
2009.03.15
Винрар


15-1231596547
Slider007
2009-01-10 17:09
2009.03.15
С днем рождения ! 2 января 2009 пятница


15-1231668887
depoint
2009-01-11 13:14
2009.03.15
Существуют ли другие карты


8-1190734233
Xdebugger
2007-09-25 19:30
2009.03.15
Как программно выделить определённую частоту?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский