powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Strict private
25 сообщений из 95, страница 3 из 4
Strict private
    #39615014
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteчччДпропущено...


А как ты реализуешь два класса в раздельных модулях, чтобы в каждом классе было поле типа другого класса?
Это не C#, тут от циклических ссылок в uses компилятор благим матом вопит.
Думаешь, в дельфи монструозных размеров модули создают из-за гигантофилии?

Это решается разделением абстракции от реализации
Код покажи.
...
Рейтинг: 0 / 0
Strict private
    #39615034
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
чччДX-Citeпропущено...


Это решается разделением абстракции от реализации
Код покажи.
ща он интерфейсов накидает
...
Рейтинг: 0 / 0
Strict private
    #39615049
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorща он интерфейсов накидает

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

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

В первом случае тоже можно обойтись без интерфейсов, если делегировать принцип наблюдения другим классам. Но это будет слегка
...
Рейтинг: 0 / 0
Strict private
    #39615056
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шо тут показывать. Сделать одному из классов предка в отдельном модуле, да и всё. И в оба модуля подключить этот доп. модуль. Ну а во втором классе тип свойства указать как этот предок.
Всё.
...
Рейтинг: 0 / 0
Strict private
    #39615062
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Citedefecatorща он интерфейсов накидает

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

При чем, если уведомлять коллекцию надо только для того, чтобы она уведомила другие элементы, то паттерн Наблюдатель тут не нужен.
Здесь поможет Посредник
...
Рейтинг: 0 / 0
Strict private
    #39615067
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteПри чем, если уведомлять коллекцию надо только для того, чтобы она уведомила другие элементы, то паттерн Наблюдатель тут не нужен.
Здесь поможет Посредник если перевести на русский, то это звучит как "фигачь OnClick, OnDraw, .... и ... выё..."
...
Рейтинг: 0 / 0
Strict private
    #39615087
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Citedefecatorща он интерфейсов накидает

... Например...

Код давай.
...
Рейтинг: 0 / 0
Strict private
    #39615088
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДX-Citeпропущено...


... Например...

Код давай.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
unit U1;
interface
type

  TClass_1 = class
    public 
      f : TClass_2
  end;

implementation
end.


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
unit U2;
interface
type

  TClass_2 = class
    public 
      f : TClass_1
  end;

implementation
end.



Дополни код, чтобы он компилировался.
...
Рейтинг: 0 / 0
Strict private
    #39615092
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорош троллить человека. :)
Ну третий модуль добавь, например.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Strict private
    #39615093
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...паттерн Наблюдатель...Посредник...
И го'вна от GoF тоже не помогут, никак.
...
Рейтинг: 0 / 0
Strict private
    #39615096
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам...
Ну третий модуль добавь, например.


И чем это поможет? В Delphi уже позволена Forward declaration классов за пределами модуля?
...
Рейтинг: 0 / 0
Strict private
    #39615098
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД> И чем это поможет?


От circular unit reference спасёт, ссылаться на третий модуль позволит.

P.S. Выключи дурочку.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Strict private
    #39615110
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДчччДпропущено...


Код давай.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
unit U1;
interface
type

  TClass_1 = class
    public 
      f : TClass_2
  end;

implementation
end.


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
unit U2;
interface
type

  TClass_2 = class
    public 
      f : TClass_1
  end;

implementation
end.



Дополни код, чтобы он компилировался.

Это называется некорректно спроектированная архитектура. Так нельзя писать. Для этого необходимо произвести композицию реализации с выделением абстракции...
То что вы написали, называется, как умею так и пишу... А сама среда еще и потворствует не думать, а писать как умею...
Вся суть RAD в том, чтобы быстро выпускать небольшие продукты не рассчитывая на расширяемость...
Когда проект или фреймворк превращается в долгоиграющий с постоянным расширением фуфнкционала растянутым во времени, такая практика приводит к печальным последствиям... Например к словам проще все переписать, чем вникнуть...
...
Рейтинг: 0 / 0
Strict private
    #39615118
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite...некорректно спроектированная архитектура...нельзя...необходимо произвести композицию реализации с выделением абстракции...

Эту скучную песенку постоянно пели и шарписты, пока в очередной версии им перекрестные ссылки не разрешили.
Теперь они просто действительно разносят классы по модулям. Или не разносят, в зависимости от настроения.
Как и си-плюс-плюсники и другие программисты (кроме дельфистов, конечно, которые не просто катят квадратное колесо, а еще и нахваливают дорожные ямы).

А так-то, да, так писать нельзя, полностью согласен. В Delphi. Не скомпилируется ибо.
Исключительно из-за рукожопости разработчиков компилятора Delphi.
...
...
...
Ну так что - будет код или ля-ля про паттерны дальше будешь?
...
Рейтинг: 0 / 0
Strict private
    #39615119
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Циркулярные" ссылки, конечно, не "перекрестные". :)
...
Рейтинг: 0 / 0
Strict private
    #39615120
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДНу так что - будет код или ля-ля про паттерны дальше будешь?
Окей.. Чтобы написать код, мне нужна цель для которой необходимо так сделать...
Ставь цель: например TA с помощью FB должен сделать то, а TB с помощью FA должен сделать это.. А я что-нибудь придумаю...
...
Рейтинг: 0 / 0
Strict private
    #39615122
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамчччД> И чем это поможет?


От circular unit reference спасёт, ссылаться на третий модуль позволит.

P.S. Выключи дурочку.

Может, хоть ты код покажешь?
21257210 - допиши несколько строк, трудно тебе, что ли.
...
Рейтинг: 0 / 0
Strict private
    #39615128
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД> Может, хоть ты код покажешь?
> 21257210 - допиши несколько строк, трудно тебе, что ли.

Какой-то ты вредный в ночь со вторника на четверг.
Не трудно, а лень. Ну, например, так

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  TClass_2 = class(TClass_2_Base)
    public
      f : TClass_1;
  end;

  TClass_1 = class
    public
      f : TClass_2_Base;
  end;

  Unit3:
  TClass_2_Base = class
  end;



Давай, начинай рассказывать, что это некошерно, лишний модуль и класс
и вообще тебе обязательно ссылка на потомок нужна, а не на базовый.
Я заранее со всем соглашусь, чтобы два раза не вставать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Strict private
    #39615131
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteчччДНу так что - будет код или ля-ля про паттерны дальше будешь?
Окей.. Чтобы написать код, мне нужна цель для которой необходимо так сделать...
Ставь цель: например TA с помощью FB должен сделать то, а TB с помощью FA должен сделать это.. А я что-нибудь придумаю...

Вот тебе цель, вместе с ТЗ: 21257210
Ты же не обезьянка, а программист, должен уметь решать абстрактные задачи. Тем более, я тебя за язык не тянул, ты сам вызвался.

А если у тебя вопросы по примерам - открой, к примеру, файл DB.pas - там их море.
И заодно задумайся - от чего там в начале модуля такие смешные строчки:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
type

{ Forward declarations }

  TFields = class;
  TField = class;
  TObjectField = class;
  TDataLink = class;
  TDataSource = class;
  TDataSet = class;
  TFieldDefs = class;
  TIndexDefs = class;
...
...



Ты действительно думаешь, в этом модуле более 10тыс исключительно из любви к искусству? Нет, всего лишь потому, что классы. определенные в модуле, имеют члены с типом других классов, циркулярно.
...
Рейтинг: 0 / 0
Strict private
    #39615132
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. Конечно, от этого давно пора избавиться.
Равно как и от невозможности нормально код
класса по модулям разносить.

P.P.S. Чего у нас только нет! И этого у нас тоже нет... (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Strict private
    #39615135
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамчччД> Может, хоть ты код покажешь?
> 21257210 - допиши несколько строк, трудно тебе, что ли.

Какой-то ты вредный в ночь со вторника на четверг.
Не трудно, а лень. Ну, например, так

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  TClass_2 = class(TClass_2_Base)
    public
      f : TClass_1;
  end;

  TClass_1 = class
    public
      f : TClass_2_Base;
  end;

  Unit3:
  TClass_2_Base = class
  end;



Давай, начинай рассказывать, что это некошерно, лишний модуль и класс
и вообще тебе обязательно ссылка на потомок нужна, а не на базовый.
Я заранее со всем соглашусь, чтобы два раза не вставать.


А давай "классовые" типы всегда типа TObject задавать - вот и нет проблемы, они ж все от него наследуются, и третий модуль не понадобится.
Что нам, трудно явно к нужному типу привести. Это и дисциплинирует, и вообще - модно, молодежно.
...
Рейтинг: 0 / 0
Strict private
    #39615136
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смысла ругать дельфи нет: все равно ничего не исправишь, надо пользоваться тем, что есть.

Надо спать идти. Вот.
...
Рейтинг: 0 / 0
Strict private
    #39615137
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Strict private
    #39615140
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДА если у тебя вопросы по примерам - открой, к примеру, файл DB.pas - там их море.
И заодно задумайся - от чего там в начале модуля такие смешные строчки:
Код: pascal
1.
2.
3.
type
{ Forward declarations }
  TFields = class;


Ты действительно думаешь, в этом модуле более 10тыс исключительно из любви к искусству? Нет, всего лишь потому, что классы. определенные в модуле, имеют члены с типом других классов, циркулярно.

Потому что криво спроектирована архитектура))))
берем пример TField

Код: pascal
1.
2.
3.
4.
{ Forward declarations }

  TFields = class;
  TField = class;



Это сделано из-за вот такого говнокода:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
{ TFieldsEnumerator }

  TFieldsEnumerator = class
  private
    FIndex: Integer;
    FFields: TFields;
  public
    constructor Create(AFields: TFields);
    function GetCurrent: TField;
    function MoveNext: Boolean;
    property Current: TField read GetCurrent;
  end;

{ TFields }

  TFields = class(TObject)
  private



Если выделить абстракцию Перечислитель в абстрактный класс, то TFieldsEnumerator можно будет объявить после TFields и TField и тогда не понадобится forward

А так сделано потому, что TFields унаследован от TObject а TField от TComponent, Хотя по сути TFields это некая коллекция (список, словарь и т.п.), следовательно если бы выделили ее в отдельную абстракцию...
Например вот так.. мне лень сделать это красивее...
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
 TAbstractStrangeField = class(TComponent)
  end;

  TAbstractStrangeCollection<T: TAbstractStrangeField> = class
  private
    function GetField(Index: Integer): T;
    procedure SetField(Index: Integer; const Value: T);
    function GetCount: Integer;
  public
    property Count: Integer read GetCount;
    property Fields[Index: Integer]: T read GetField write SetField; default;
  end;

  TAbstractFieldsEnumerator<T: TAbstractStrangeField> = class
  private
    FIndex: Integer;
    FFields: TAbstractStrangeCollection<T>;
  public
    constructor Create(AFields: TAbstractStrangeCollection<T>);
    function GetCurrent: T;
    function MoveNext: Boolean;
    property Current: T read GetCurrent;
  end;

  TField = class(TAbstractStrangeField)
  end;

  TConcrateEnumerator = class(TAbstractFieldsEnumerator<TField>)
  end;

  TFields = class(TAbstractStrangeCollection<TField>)
  public
    function GetEnumerator: TConcrateEnumerator;
  end;



Все работает
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TForm1.FormCreate(Sender: TObject);
var
  A: TFields;
  B: TField;
begin
  for B in A do
    ;
end;
...
Рейтинг: 0 / 0
Strict private
    #39615161
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-Cite,
ну с генериками финт раньше нельзя было сделать

А теперь давай их все, как предлагают, выделим в отдельные модуля - итого выходит 6 модулей. Зашибись ...
...
Рейтинг: 0 / 0
25 сообщений из 95, страница 3 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Strict private
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]