Вопрос про циклические ссылки

Artem.1st
Дата: 06.08.2019 21:11:46
Простая ситуация: Два класса ссылаются друг на друга. Это вполне допустимо и реализуется с помощью forward-объявления.
Но, еще надо разнести эти классы в разные модули. И как теперь быть, ведь на другой модуль forward не действует?

// UnitA.pas

TMyClassA = class
   fClassB : TMyClassB;
end; 

// UnitB.pas

TMyClassB = class
   fClassA : TMyClassA;
end; 

М.б. есть какие-нибудь хитрости, трюки (например, сделать 3й модуль связующий) ?
Gerasimenko
Дата: 06.08.2019 21:20:56
Artem.1st,

Только один вопрос: зачем?
Ответ на этот вопрос многое прояснит как тебе, так и тем, к кому ты обращаешься.
Artem.1st
Дата: 06.08.2019 21:30:15
Gerasimenko
Artem.1st,
Только один вопрос: зачем?

На “Зачем..” ответ есть, и вполне логичный.
Но, боюсь, что ответив на вопрос ”зачем”, появится 2, 3 вопросы и тема уйдет в оффтопик.
X-Cite
Дата: 06.08.2019 21:50:55
Artem.1st,

Чтобы не было циклических ссылок выделяется абстракция..

Вы опишите ваш пример, а мы придумаем как это сделать, чтобы не было ссылок..

P.S. а forward по моему мнению мешает правильно создавать архитектуру приложений
DimaBr
Дата: 06.08.2019 22:07:22
TMyClassA = class
   fClassB : TObject;
end; 

TMyClassB = class
   fClassA : TObject;
end; 


function GetClassB(A: TMyClassA): TMyClassB;
begin
  Result := TMyClassB(A.fClassB);
end;
ёёёёё
Дата: 07.08.2019 00:48:12
Artem.1st,
нельзя, сто раз уже перемывали. Вали все связанные классы в один общий модул, вся vcl так сделана. Или в позе креветки выдумывай "абстракции" или тупо используй поля типа TObject с явным приведением к нужному типу в секции реализации.

Се ля ви, косяк компилятора. Адепты, глотая пену, назыаают фичей.
В других ЯП тоже раньше так было, тоже считалось фичей, пока не поправили.
ёёёёё
Дата: 07.08.2019 00:51:37
Кстати, ТС уже поднимал сию тему, и, имхо, тупо. троллит.
Artem.1st
Дата: 07.08.2019 10:53:40
X-Cite
Чтобы не было циклических ссылок выделяется абстракция..

Спасибо за ответ.
Но, не хочется избиваляться от циклических ссылок. Наоборот, нужно научиться с ними правильно работать.

DimaBr
function GetClassB(A: TMyClassA): TMyClassB;
begin
  Result := TMyClassB(A.fClassB);
end;

Спасибо за пример.
Хотя, явное приведение типов - это слегка “грубоватый” способ, но, натолкнуло на идею: Как-нибудь организовать циклические ссылки при помощи полиморфизма, чтоб компилятор автоматом распознал нужный тип.
Artem.1st
Дата: 07.08.2019 10:55:36
ёёёёё
Вали все связанные классы в один общий модул,

Циклические ссылки описанные в одном модуле - это пока самый простой способ.
Но, вопрос был: Как разнести в разные модули?

ёёёёё
Кстати, ТС уже поднимал сию тему ...

Таких тем(и даже близких по смыслу) я раньше не поднимал.
Тролите?!
На здоровье, лишь бы другим не мешало...
X-Cite
Дата: 07.08.2019 11:02:04
Artem.1st
Но, не хочется избавляться от циклических ссылок. Наоборот, нужно научиться с ними правильно работать.

Правильно с ними работать - это не строить архитектуру классов так, чтобы они были.

TA1 = class

TB = class
A: TA1;

TA2 = class(TA)
B: TB;

Вот так с ними правильно работать...