showcase18.mod 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. MODULE Showcase18;
  2. // Session showcase: VIRTUAL dispatch through vtables.
  3. //
  4. // A Shape hierarchy (Circle, Square) with a virtual Area(); an array
  5. // of base-class pointers holds objects of both kinds, and each Area()
  6. // is resolved at run time. The sum is asserted and printed.
  7. // Expected ExitCode: 42.
  8. IMPORT TextIO, Conversions;
  9. TYPE
  10. CLASS Shape;
  11. VIRTUAL PROCEDURE Area() : INTEGER;
  12. END Shape;
  13. CLASS Circle (Shape);
  14. r : INTEGER;
  15. PROCEDURE SetR(v : INTEGER);
  16. VIRTUAL PROCEDURE Area() : INTEGER;
  17. END Circle;
  18. CLASS Square (Shape);
  19. s : INTEGER;
  20. PROCEDURE SetS(v : INTEGER);
  21. VIRTUAL PROCEDURE Area() : INTEGER;
  22. END Square;
  23. CLASS IMPLEMENTATION Shape;
  24. PROCEDURE Area() : INTEGER;
  25. BEGIN RETURN 0 END Area;
  26. END Shape;
  27. CLASS IMPLEMENTATION Circle;
  28. PROCEDURE SetR(v : INTEGER);
  29. BEGIN r := v END SetR;
  30. PROCEDURE Area() : INTEGER;
  31. BEGIN RETURN r * r END Area;
  32. END Circle;
  33. CLASS IMPLEMENTATION Square;
  34. PROCEDURE SetS(v : INTEGER);
  35. BEGIN s := v END SetS;
  36. PROCEDURE Area() : INTEGER;
  37. BEGIN RETURN s * s END Area;
  38. END Square;
  39. VAR ExitCode : INTEGER;
  40. VAR shapes : ARRAY [0 .. 5] OF POINTER TO Shape;
  41. VAR a, b : POINTER TO Circle;
  42. VAR c, d : POINTER TO Square;
  43. VAR e : POINTER TO Circle;
  44. VAR f : POINTER TO Square;
  45. VAR line, num : ARRAY [0 .. 63] OF CHAR;
  46. VAR i, total : INTEGER;
  47. BEGIN
  48. ExitCode := 0;
  49. NEW(a); a^.SetR(3); (* 9 *)
  50. NEW(b); b^.SetR(5); (* 25 *)
  51. NEW(c); c^.SetS(4); (* 16 *)
  52. NEW(d); d^.SetS(6); (* 36 *)
  53. NEW(e); e^.SetR(2); (* 4 *)
  54. NEW(f); f^.SetS(7); (* 49 *)
  55. shapes[0] := a; shapes[1] := b; shapes[2] := c;
  56. shapes[3] := d; shapes[4] := e; shapes[5] := f;
  57. total := 0;
  58. i := 0;
  59. WHILE i <= 5 DO
  60. total := total + shapes[i]^.Area(); (* virtual dispatch *)
  61. INC(i)
  62. END;
  63. Conversions.IntToStr(total, num);
  64. line := "showcase18 areas sum=" + num;
  65. TextIO.WriteString(line);
  66. TextIO.WriteLn;
  67. IF total = 139 THEN ExitCode := 42 ELSE ExitCode := 1 END
  68. END Showcase18.