Начало » Программирование » Delphi » перекрёстные ссылки в декларациях классов (дилемма курицы и яйца)
перекрёстные ссылки в декларациях классов [сообщение #1696] |
Mon, 27 February 2023 16:35 |
МП
Сообщений: 889 Зарегистрирован: 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
Сообщений: 150 Зарегистрирован: 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 |
МП
Сообщений: 889 Зарегистрирован: August 2022 Географическое положение: бурятский тун...
|
Senior Member |
|
|
shalamyanskyНе очень понятно, как нужда в таком возникла. Обычно стараются развязать классы друг от друга или обойтись однонаправленной зависимостью. Если же от взаимозависимости не избавиться, её выносят на уровень интерфейсов или абстрактных классов. Вот так видится решение через базовые классы. идея интересная, спасибо!
я пробовал через интерфейсы (IChicken = interface и т.д.), но там проблемы с приведением классов.
предложенный вариант с базовыми классами интереснее.
|
|
|
Переход к форуму:
Текущее время: Sun Dec 22 18:49:01 GMT+3 2024
Общее время, затраченное на создание страницы: 0.00610 секунд
|