2
0

tgeneric15.pp 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. program Project1;
  2. {$mode objfpc}{$H+}
  3. type
  4. { TStack }
  5. generic TStack<T> = class(TObject)
  6. public
  7. procedure Clear; virtual;
  8. destructor Destroy; override;
  9. end;
  10. { TIntegerStack }
  11. TIntegerStack = class(specialize TStack<Integer>)
  12. public
  13. procedure Clear; override;
  14. end;
  15. { TIntegerStack2 }
  16. TIntegerStack2 = class(specialize TStack<Integer>)
  17. public
  18. procedure Clear; override;
  19. end;
  20. var
  21. Idx : Longint;
  22. { TIntegerStack }
  23. procedure TIntegerStack.Clear;
  24. begin
  25. Writeln('new clear');
  26. Idx:=Idx or 1;
  27. end;
  28. { TIntegerStack2 }
  29. procedure TIntegerStack2.Clear;
  30. begin
  31. Writeln('new clear2');
  32. Idx:=Idx or 2;
  33. end;
  34. { TStack }
  35. procedure TStack.Clear;
  36. begin
  37. Writeln('old clear');
  38. end;
  39. destructor TStack.Destroy;
  40. begin
  41. Writeln('old destroy');
  42. Clear;
  43. end;
  44. var
  45. s: TIntegerStack;
  46. s2: TIntegerStack2;
  47. begin
  48. Idx:=0;
  49. s := TIntegerStack.Create;
  50. Writeln(s.ClassName);
  51. s.Free;
  52. s2 := TIntegerStack2.Create;
  53. Writeln(s2.ClassName);
  54. s2.Free;
  55. if Idx<>3 then
  56. halt(1);
  57. end.