tgeneric22.pp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. {$mode objfpc}{$H+}
  2. type
  3. generic TGListItem<T> = class(TObject)
  4. public var
  5. FValue: T;
  6. FNext: TGListItem;
  7. procedure SetValue(Value: T);
  8. function GetValue: T;
  9. procedure Assign(Source: TGListItem);
  10. function Merge(Other: TGListItem): TGListItem;
  11. end;
  12. procedure TGListItem.SetValue(Value: T);
  13. begin
  14. FValue := Value;
  15. end;
  16. function TGListItem.GetValue: T;
  17. begin
  18. Result := FValue;
  19. end;
  20. procedure TGListItem.Assign(Source: TGListItem);
  21. begin
  22. FNext := Source;
  23. end;
  24. function TGListItem.Merge(Other: TGListItem): TGListItem;
  25. var
  26. Temp: TGListItem;
  27. begin
  28. Temp := TGListItem.Create;
  29. Temp.SetValue(FNext.GetValue + Other.FNext.GetValue);
  30. Result := Temp;
  31. end;
  32. type
  33. TIntListItem = specialize TGListItem<Integer>;
  34. var
  35. A, A2, B, B2: TIntListItem;
  36. begin
  37. A := TIntListItem.Create;
  38. A2 := TIntListItem.Create;
  39. A.Assign(A2);
  40. if A.FNext <> A2 then
  41. halt(1);
  42. B := TIntListItem.Create;
  43. B2 := TIntListItem.Create;
  44. B.Assign(B2);
  45. if B.FNext <> B2 then
  46. halt(1);
  47. A2.SetValue(5);
  48. if A2.GetValue <> 5 then
  49. halt(1);
  50. B2.SetValue(7);
  51. if B2.GetValue <> 7 then
  52. halt(1);
  53. if A.Merge(B).GetValue <> 12 then
  54. halt(1);
  55. end.