SQLRU.net
Разработка приложений баз данных

Начало » Программирование » Delphi » перекрёстные ссылки в декларациях классов (дилемма курицы и яйца)
перекрёстные ссылки в декларациях классов [сообщение #1696] Mon, 27 February 2023 16:35 Переход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 795
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
такой вот классический случай.

модуль №1
unit uEgg;

interface

uses
  uChicken;

type
  TEgg = class
  private
    FChicken: TChicken;
  published
    property Chicken: TChicken read FChicken write FChicken;
  end;

implementation
. . .
end.
модуль №2
unit uChicken;

interface

uses
  uEgg;

type
  TChicken = class
  private
    FEgg: TEgg;
  published
    property Egg: TEgg read FEgg write FEgg;
  end;

implementation
. . .
end.

кто как решает подобные коллизии?
слить в один модуль - не канает.
Re: перекрёстные ссылки в декларациях классов [сообщение #1702 является ответом на сообщение #1696] Tue, 28 February 2023 13:10 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 142
Зарегистрирован: August 2022
Senior Member
Не очень понятно, как нужда в таком возникла. Обычно стараются развязать классы друг от друга или обойтись однонаправленной зависимостью. Если же от взаимозависимости не избавиться, её выносят на уровень интерфейсов или абстрактных классов. Вот так видится решение через базовые классы. Не проверял.

unit incubator;

interface

type

  TAbstractChicken = class;

  TAbstractEgg = class
    public
      property  Chicken: TAbstractChicken read GetChicken write SetChicken;
      function  GetChichen:TAbstractChicken; virtual; abstract;
      procedure SetChicken( Chicken:TAbstractChicken ); virtual; abstract;
  end;

  TAbstractChicken = class
    public
      property  Egg: TAbstractEgg read GetEgg write SetEgg;
      function  GetEgg:TAbstractEgg; virtual; abstract;
      procedure SetEgg( Egg:TAbstractEgg ); virtual; abstract;
  end;
unit uEgg;

interface

uses
  incubator
;  

type

  TEgg = class( TAbstractEgg )
    private
      fChicken : TAbstractChicken;
    public
      function  GetChichen:TAbstractChicken; override;
      procedure SetChicken( Chicken:TAbstractChicken ); override;
    published
      property  Chicken;
  end;

implementation

uses
  uChicken
;

TEgg.GetChicken:TAbstractChicken;
begin
    Result := fChicken;
end;

TEgg.SetChicken( aChicken:TAbstractChicken );
begin
    fChicken := aChicken;
end;
unit uChicken;

interface

uses
  incubator
;  

type

  TChicken = class( TAbstractChicken )
    private
      fEgg : TAbstractEgg;
      procedure DoSomethingWitnEgg;
    public
      function  GetEgg:TAbstractEgg; override;
      procedure SetEgg( aEgg:TAbstractEgg ); override;
    published
      property  Egg;
  end;

implementation

uses
  uEgg
;

TChicken.GetEgg:TAbstractEgg;
begin
    Result := fEgg;
end;

TChicken.SetEgg( aEgg:TAbstractEgg );
begin
    fEgg := aEgg;
end;

procedure TChicken.DoSomethingWitnEgg;
begin
    DoSomething( TEgg( fEgg ) );
end;
unit coop;

interface

uses
    uChicken
  , uEgg 
;  

function CreateChickenWithEgg:TChicken;

implementation

function CreateChickenWithEgg:TChicken;
var
    lChicken : TChicken;
    lEgg     : TEgg;
begin
    lChicken     := TChicken.Create;
    lEgg         := TEgg.Create;
    lChicken.Egg := lEgg;
    lEgg.Chicken := lChicken;
    Result       := lChicken;
end;

[Обновления: Tue, 28 February 2023 14:37]

Известить модератора

Re: перекрёстные ссылки в декларациях классов [сообщение #1703 является ответом на сообщение #1702] Tue, 28 February 2023 14:36 Переход к предыдущему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 795
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
shalamyansky
Не очень понятно, как нужда в таком возникла. Обычно стараются развязать классы друг от друга или обойтись однонаправленной зависимостью. Если же от взаимозависимости не избавиться, её выносят на уровень интерфейсов или абстрактных классов. Вот так видится решение через базовые классы.
идея интересная, спасибо!
я пробовал через интерфейсы (IChicken = interface и т.д.), но там проблемы с приведением классов.
предложенный вариант с базовыми классами интереснее.
Предыдущая тема: Exception.Create без raise
Следующая тема: FireBird 2.5.3 к 3.0.4
Переход к форуму:
  


Текущее время: Sat Apr 20 00:33:00 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00748 секунд