tgeneric16.pp 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. TAdvStack = class(specialize TStack<T>)
  12. public
  13. procedure Clear; override;
  14. end;
  15. { TIntegerStack }
  16. TIntegerStack = specialize TAdvStack<Integer>;
  17. { TIntegerStack2 }
  18. TIntegerStack2 = class(specialize TAdvStack<Integer>);
  19. public
  20. procedure Clear; override;
  21. end;
  22. var
  23. Idx : Longint;
  24. { TAdvStack }
  25. procedure TAdvStack.Clear;
  26. begin
  27. Writeln('new clear');
  28. Idx:=Idx or 1;
  29. end;
  30. { TIntegerStack2 }
  31. procedure TIntegerStack2.Clear;
  32. begin
  33. Writeln('new clear2');
  34. Idx:=Idx or 2;
  35. end;
  36. { TStack }
  37. procedure TStack.Clear;
  38. begin
  39. Writeln('old clear');
  40. end;
  41. destructor TStack.Destroy;
  42. begin
  43. Writeln('old destroy');
  44. Clear;
  45. end;
  46. var
  47. s : TIntegerStack;
  48. s2 : TIntegerStack2;
  49. begin
  50. Idx:=0;
  51. s := TIntegerStack.Create;
  52. Writeln(s.ClassName);
  53. s.Free;
  54. s2 := TIntegerStack2.Create;
  55. Writeln(s2.ClassName);
  56. s2.Free;
  57. if Idx<>3 then
  58. halt(1);
  59. end.