-
Саня © (17.04.18 09:19) [0]Добрый день. Есть два класса описанных в двух разных модулях. Как организовать логику приложения, так чтобы можно было вызывать в классе A методы класса В, а в классе В методы класса А? Желательно в каждом классе в качестве приватного поля иметь ссылки на друг друга, чтобы работать через них. Подскажите, как это правильно организовать?
-
Styx © (17.04.18 09:57) [1]Засунуть их в один модуль.
-
Тимохов Дима © (17.04.18 10:35) [2]Напрямую никак (ну или засунуть в один модуль, как сказано).
Т.е. никак не сделать так, чтобы в private секции каждого класса из разных модулей были ссылки друг на друга.
Но можно что-то придумать.
Например, так:
1. В класса TClass1 модуля Unit1 есть private-член класс TObject.
2. В класса TClass2 модуля Unit2 есть private-член класс TClass1. Соответственно в uses в interface есть указание Unit1.
3. В Unit1 в uses в implementation есть указание Unit2
4. В коде TClass2 используешь private-член класса TClass1 как есть без приведения.
5. В коде TClass1 используешь private-член класса TObject с приведением к TClass2 - т.е. так TClass2(FClass2) -
aka © (17.04.18 10:52) [3]
> Напрямую никак (ну или засунуть в один модуль, как сказано).
Ну среды под рукой нет. Но и так не получится кажется? Компиляторы Delphi однопроходные и даже в одном модуле одно объявление будет класса будет ранее другого, и как вы там тогда объявите поле типа класса который ниже? -
aka © (17.04.18 10:54) [4]
> 1. В класса TClass1 модуля Unit1 есть private-член класс
> TObject.
> 2. В класса TClass2 модуля Unit2 есть private-член класс
> TClass1. Соответственно в uses в interface есть указание
> Unit1.
> 3. В Unit1 в uses в implementation есть указание Unit2
> 4. В коде TClass2 используешь private-член класса TClass1
> как есть без приведения.
> 5. В коде TClass1 используешь private-член класса TObject
> с приведением к TClass2 - т.е. так TClass2(FClass2)
Только так. -
Тимохов Дима © (17.04.18 11:14) [5]
> Только так.
Ну можно еще абстрактного предка TClass3 в Unit3 для TClass2 сделать. Т.е. в три модуля. -
Тимохов Дима © (17.04.18 13:10) [6]
> aka © (17.04.18 10:52) [3]
> > Напрямую никак (ну или засунуть в один модуль, как сказано).
> Ну среды под рукой нет. Но и так не получится кажется? Компиляторы
> Delphi однопроходные и даже в одном модуле одно объявление
> будет класса будет ранее другого, и как вы там тогда объявите
> поле типа класса который ниже?
Подзабыл ты дельфи)))type
TClass1 = class;
TClass2 = class
Class1: TClass1;
end
TClass1 = class
Class2: TClass2;
end -
Игорь Шевченко © (17.04.18 13:47) [7]Как это делается обычно, когда нельзя выпрямить дизайн:
В приватных полях используется общий тип для классов, например, TObject.
В секции interface ссылок друг на друга нет, в секции implementation каждый модуль ссылается на другой. В месте, где нужно вызывать метод конкретного класса, выполняется приведение приватного поля к нужному типу.unit Unit1;
interface
type
TClass1 = class
...
FClass2: TObject;
...
public
procedure Foo;
end;
implementation
uses
Unit2;
....
end.
unit Unit2;
interface
type
TClass2 = class
...
FClass1: TObject;
...
public
procedure Bar;
end;
implementation
uses
Unit1;
....
end.
Где-нибудь внутри:(FClass1 as TClass1).Foo;
...
(FClass2 as TClass2).Bar; -
Внук © (17.04.18 17:01) [8]А если в приватных полях классов сделать ссылки не на классы, а на интерфейсы, которые объявить в третьем модуле, это не спасет отца русской демократии?