{$mode objfpc} {$h+} {$modeswitch duplicatelocals}

uses
	SysUtils;

type
	Reference = IInterface;

	TVegetable = class;

	TVegetableGarden = class(TInterfacedObject)
		name: string;
		constructor Create(const name: string);
		destructor Destroy; override;
		procedure Plant(v: TVegetable);
		procedure RollCall;
	private
		vegetables: array of record
			v: TVegetable;
			vRef: Reference;
		end;
	end;

	TVegetable = class(TInterfacedObject)
		garden: TVegetableGarden;
		name: string;
		weight: single;
		constructor Create(const name: string; const weight: single);
		destructor Destroy; override;
		procedure RespondToRollCall;
	end;

	constructor TVegetableGarden.Create(const name: string);
	begin
		inherited Create;
		self.name := name;
	end;

	destructor TVegetableGarden.Destroy;
	var
		i: SizeInt;
	begin
		writeln('Огород «', name, '» уничтожается.');
		for i := 0 to High(vegetables) do
			vegetables[i].v.garden := nil;
		inherited Destroy;
	end;

	procedure TVegetableGarden.Plant(v: TVegetable);
	begin
		SetLength(vegetables, length(vegetables) + 1);
		vegetables[High(vegetables)].v := v;
		vegetables[High(vegetables)].vRef := v;
		v.garden := self;
	end;

	procedure TVegetableGarden.RollCall;
	var
		i: SizeInt;
	begin
		for i := 0 to High(vegetables) do
			vegetables[i].v.RespondToRollCall;
	end;

	constructor TVegetable.Create(const name: string; const weight: single);
	begin
		inherited Create;
		self.name := name;
		self.weight := weight;
	end;

	destructor TVegetable.Destroy;
	begin
		writeln('Овощ «', name, '» уничтожается.');
		inherited Destroy;
	end;

	procedure TVegetable.RespondToRollCall;
	begin
		writeln('<', garden.name, '>: ', name, ', вес ', FloatToStrF(weight, ffGeneral, 6, 0), ' кг');
	end;

	procedure Main;
	var
		garden: TVegetableGarden;
		gardenRef: Reference;
	begin
		garden := TVegetableGarden.Create('ОВОЩИ');
		gardenRef := garden;
		garden.Plant(TVegetable.Create('картофель', 1.4));
		garden.Plant(TVegetable.Create('чеснок', 0.05));
		garden.Plant(TVegetable.Create('Рируру', 54));
		garden.Plant(TVegetable.Create('PoppyFanboy', 65));
		garden.RollCall;
	end;

begin
	Main;
end.