Начало » Программирование » 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 и т.д.), но там проблемы с приведением классов. 
предложенный вариант с базовыми классами интереснее. 
		
		
		
 |  
	| 
		
	 | 
 
 
 |   
Переход к форуму:
 
 Текущее время: Tue Nov 04 15:45:40 GMT+3 2025 
 Общее время, затраченное на создание страницы: 0.00593 секунд 
 |