Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Вопрос про циклические ссылки  [new]
Artem.1st
Member

Откуда:
Сообщений: 109
Простая ситуация: Два класса ссылаются друг на друга. Это вполне допустимо и реализуется с помощью forward-объявления.
Но, еще надо разнести эти классы в разные модули. И как теперь быть, ведь на другой модуль forward не действует?

// UnitA.pas

TMyClassA = class
   fClassB : TMyClassB;
end; 

// UnitB.pas

TMyClassB = class
   fClassA : TMyClassA;
end; 

М.б. есть какие-нибудь хитрости, трюки (например, сделать 3й модуль связующий) ?
6 авг 19, 21:11    [21943312]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4530
Artem.1st,

Только один вопрос: зачем?
Ответ на этот вопрос многое прояснит как тебе, так и тем, к кому ты обращаешься.
6 авг 19, 21:20    [21943314]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
Artem.1st
Member

Откуда:
Сообщений: 109
Gerasimenko
Artem.1st,
Только один вопрос: зачем?

На “Зачем..” ответ есть, и вполне логичный.
Но, боюсь, что ответив на вопрос ”зачем”, появится 2, 3 вопросы и тема уйдет в оффтопик.
6 авг 19, 21:30    [21943316]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1604
Artem.1st,

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

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

P.S. а forward по моему мнению мешает правильно создавать архитектуру приложений
6 авг 19, 21:50    [21943331]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
DimaBr
Member

Откуда:
Сообщений: 11330
TMyClassA = class
   fClassB : TObject;
end; 

TMyClassB = class
   fClassA : TObject;
end; 


function GetClassB(A: TMyClassA): TMyClassB;
begin
  Result := TMyClassB(A.fClassB);
end;
6 авг 19, 22:07    [21943340]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
ёёёёё
Member

Откуда:
Сообщений: 1371
Artem.1st,
нельзя, сто раз уже перемывали. Вали все связанные классы в один общий модул, вся vcl так сделана. Или в позе креветки выдумывай "абстракции" или тупо используй поля типа TObject с явным приведением к нужному типу в секции реализации.

Се ля ви, косяк компилятора. Адепты, глотая пену, назыаают фичей.
В других ЯП тоже раньше так было, тоже считалось фичей, пока не поправили.
7 авг 19, 00:48    [21943383]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
ёёёёё
Member

Откуда:
Сообщений: 1371
Кстати, ТС уже поднимал сию тему, и, имхо, тупо. троллит.
7 авг 19, 00:51    [21943384]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
Artem.1st
Member

Откуда:
Сообщений: 109
X-Cite
Чтобы не было циклических ссылок выделяется абстракция..

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

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

Спасибо за пример.
Хотя, явное приведение типов - это слегка “грубоватый” способ, но, натолкнуло на идею: Как-нибудь организовать циклические ссылки при помощи полиморфизма, чтоб компилятор автоматом распознал нужный тип.
7 авг 19, 10:53    [21943543]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
Artem.1st
Member

Откуда:
Сообщений: 109
ёёёёё
Вали все связанные классы в один общий модул,

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

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

Таких тем(и даже близких по смыслу) я раньше не поднимал.
Тролите?!
На здоровье, лишь бы другим не мешало...
7 авг 19, 10:55    [21943545]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1604
Artem.1st
Но, не хочется избавляться от циклических ссылок. Наоборот, нужно научиться с ними правильно работать.

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

TA1 = class

TB = class
A: TA1;

TA2 = class(TA)
B: TB;

Вот так с ними правильно работать...
7 авг 19, 11:02    [21943552]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
Artem.1st
Member

Откуда:
Сообщений: 109
X-Cite
не строить архитектуру классов так, чтобы они были.

возвращаясь от модулей к классам.
Надо понять, что плохого в взаимных(циклических) связях между классами. Якобы их надо избегать.
Т.е. лучше иметь развесистое дерево классов, чем компактный граф с циклами.
Немного утрирую, но с хорошей целью - привлечь внимание знающих людей.
14 авг 19, 19:09    [21949572]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 5341
Artem.1st
Хотя, явное приведение типов - это слегка “грубоватый” способ, но, натолкнуло на идею: Как-нибудь организовать циклические ссылки при помощи полиморфизма, чтоб компилятор автоматом распознал нужный тип.
генерики
хотя дельфи будет стойчески сопротивляться
14 авг 19, 19:19    [21949577]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60307
Artem.1st> взаимных(циклических) связях между классами. Якобы их надо избегать.

"Избегать" надо всего лишнего, так обычно проще.

> Т.е. лучше иметь развесистое дерево классов, чем компактный граф с циклами.

Это похоже на пустую болтовню. Развесистое дерево классов будет без "дублей"?

> Немного утрирую, но с хорошей целью - привлечь внимание знающих людей.

Вы это совершенно зря. В смысле, что "пофилософствовать"
не запрещено, конечно, но соотв. ярлык получите однозначно.

Posted via ActualForum NNTP Server 1.5

14 авг 19, 19:24    [21949580]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
Artem.1st
Member

Откуда:
Сообщений: 109
В смысле, что "пофилософствовать" не запрещено, конечно, но соотв. ярлык получите однозначно.

Это не филосовствование, а такой способ искать и получать нужную информацию. Этот способ удачно работает на многих IT-шных форумах. И даже на "одном" форуме, где применяют оскорбления, как средство модерирования, все равно удается выцепить нужное инфо.
14 авг 19, 20:08    [21949601]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
Док
Member

Откуда: Казань
Сообщений: 6460
Гаджимурадов Рустам
В смысле, что "пофилософствовать"
не запрещено, конечно, но соотв. ярлык получите однозначно.

+ лично, ГР
Рустам, раньше бы ты давно послал этот и аналогичные топики вместе с автором в ПТ. Стареешь, наверное ;). Неужели мусор в форуме не надоел?
14 авг 19, 22:56    [21949678]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
ёёёёё
Member

Откуда:
Сообщений: 1371
Док,

ПТ-то нет.
15 авг 19, 00:02    [21949700]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60307
Док> наверное ;)

Наверное. Хотя и ПТ нет, и мусор не "тот, что раньше". :)

Posted via ActualForum NNTP Server 1.5

15 авг 19, 14:57    [21950163]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1987
Artem.1st,

Ты про это ?
  TForm1 = class;

  TMyClass = class
  private
    FAClass: TForm1;
  public
    property AClass:TForm1 read FAClass write FAClass;
  end;

  TForm1 = class(TForm)
  end;

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

Циркулярные ссылки приводят к Runtime ошибкам при компиляции программы, и она перестанет компилироваться.
А самое главное - усложняют понимание того, что написано.

Я считаю, ты делаешь правильно и задаёшь правильные вопросы. Но другие - так не делают.
Тут классы с примерами Hello world.
Твои реальные классы могут быть не сложнее.
Но их будет дорабатывать другой человек, который уже не будет задавать таких вопросов.
В результате это разрастается до такой каши,в которой всё друг на друга ссылается и уже мало кто что понимает.
15 авг 19, 17:41    [21950382]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1987
X-Cite
Artem.1st
Но, не хочется избавляться от циклических ссылок. Наоборот, нужно научиться с ними правильно работать.

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

Не заметил)
+1
15 авг 19, 17:45    [21950389]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1987
Я делаю так.

unit Application.Interfaces;
type
  ICanWork = interface
    procedure Word(const QueryString:string);
  end;
...
unit Main.Form;
uses Application.Interfaces;

procedure TForm1.Button1Click(Sender: TObject);
 begin
  if Supports(Sender, ICanWork) then 
   (Sender as ICanWork).Work('Сделай пирогов.');
 end;
15 авг 19, 17:56    [21950411]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос про циклические ссылки  [new]
Michael Longneck
Member

Откуда: Москва
Сообщений: 2303
У Supports вариант с 3мя параметрами
15 авг 19, 19:02    [21950445]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить