fork download
  1. {$mode objfpc} {$h+} {$modeswitch duplicatelocals}
  2.  
  3. uses
  4. SysUtils;
  5.  
  6. type
  7. Reference = IInterface;
  8.  
  9. TVegetable = class;
  10.  
  11. TVegetableGarden = class(TInterfacedObject)
  12. name: string;
  13. constructor Create(const name: string);
  14. destructor Destroy; override;
  15. procedure Plant(v: TVegetable);
  16. procedure RollCall;
  17. private
  18. vegetables: array of record
  19. v: TVegetable;
  20. vRef: Reference;
  21. end;
  22. end;
  23.  
  24. TVegetable = class(TInterfacedObject)
  25. garden: TVegetableGarden;
  26. name: string;
  27. weight: single;
  28. constructor Create(const name: string; const weight: single);
  29. destructor Destroy; override;
  30. procedure RespondToRollCall;
  31. end;
  32.  
  33. constructor TVegetableGarden.Create(const name: string);
  34. begin
  35. inherited Create;
  36. self.name := name;
  37. end;
  38.  
  39. destructor TVegetableGarden.Destroy;
  40. var
  41. i: SizeInt;
  42. begin
  43. writeln('Огород «', name, '» уничтожается.');
  44. for i := 0 to High(vegetables) do
  45. vegetables[i].v.garden := nil;
  46. inherited Destroy;
  47. end;
  48.  
  49. procedure TVegetableGarden.Plant(v: TVegetable);
  50. begin
  51. SetLength(vegetables, length(vegetables) + 1);
  52. vegetables[High(vegetables)].v := v;
  53. vegetables[High(vegetables)].vRef := v;
  54. v.garden := self;
  55. end;
  56.  
  57. procedure TVegetableGarden.RollCall;
  58. var
  59. i: SizeInt;
  60. begin
  61. for i := 0 to High(vegetables) do
  62. vegetables[i].v.RespondToRollCall;
  63. end;
  64.  
  65. constructor TVegetable.Create(const name: string; const weight: single);
  66. begin
  67. inherited Create;
  68. self.name := name;
  69. self.weight := weight;
  70. end;
  71.  
  72. destructor TVegetable.Destroy;
  73. begin
  74. writeln('Овощ «', name, '» уничтожается.');
  75. inherited Destroy;
  76. end;
  77.  
  78. procedure TVegetable.RespondToRollCall;
  79. begin
  80. writeln('<', garden.name, '>: ', name, ', вес ', FloatToStrF(weight, ffGeneral, 6, 0), ' кг');
  81. end;
  82.  
  83. procedure Main;
  84. var
  85. garden: TVegetableGarden;
  86. gardenRef: Reference;
  87. begin
  88. garden := TVegetableGarden.Create('ОВОЩИ');
  89. gardenRef := garden;
  90. garden.Plant(TVegetable.Create('картофель', 1.4));
  91. garden.Plant(TVegetable.Create('чеснок', 0.05));
  92. garden.Plant(TVegetable.Create('Рируру', 54));
  93. garden.Plant(TVegetable.Create('PoppyFanboy', 65));
  94. garden.RollCall;
  95. end;
  96.  
  97. begin
  98. Main;
  99. end.
Success #stdin #stdout 0s 4552KB
stdin
Standard input is empty
stdout
<ОВОЩИ>: картофель, вес 1.4 кг
<ОВОЩИ>: чеснок, вес 0.05 кг
<ОВОЩИ>: Рируру, вес 54 кг
<ОВОЩИ>: PoppyFanboy, вес 65 кг
Огород «ОВОЩИ» уничтожается.
Овощ «картофель» уничтожается.
Овощ «чеснок» уничтожается.
Овощ «Рируру» уничтожается.
Овощ «PoppyFanboy» уничтожается.