Конференция "Начинающим" » Циклическое влючение модулей.
 
  • Саня © (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]
    А если в приватных полях классов сделать ссылки не на классы, а на интерфейсы, которые объявить в третьем модуле, это не спасет отца русской демократии?
 
Конференция "Начинающим" » Циклическое влючение модулей.
Есть новые Нет новых   [118647   +56][b:0][p:0.001]