| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- MODULE Showcase18;
- // Session showcase: VIRTUAL dispatch through vtables.
- //
- // A Shape hierarchy (Circle, Square) with a virtual Area(); an array
- // of base-class pointers holds objects of both kinds, and each Area()
- // is resolved at run time. The sum is asserted and printed.
- // Expected ExitCode: 42.
- IMPORT TextIO, Conversions;
- TYPE
- CLASS Shape;
- VIRTUAL PROCEDURE Area() : INTEGER;
- END Shape;
- CLASS Circle (Shape);
- r : INTEGER;
- PROCEDURE SetR(v : INTEGER);
- VIRTUAL PROCEDURE Area() : INTEGER;
- END Circle;
- CLASS Square (Shape);
- s : INTEGER;
- PROCEDURE SetS(v : INTEGER);
- VIRTUAL PROCEDURE Area() : INTEGER;
- END Square;
- CLASS IMPLEMENTATION Shape;
- PROCEDURE Area() : INTEGER;
- BEGIN RETURN 0 END Area;
- END Shape;
- CLASS IMPLEMENTATION Circle;
- PROCEDURE SetR(v : INTEGER);
- BEGIN r := v END SetR;
- PROCEDURE Area() : INTEGER;
- BEGIN RETURN r * r END Area;
- END Circle;
- CLASS IMPLEMENTATION Square;
- PROCEDURE SetS(v : INTEGER);
- BEGIN s := v END SetS;
- PROCEDURE Area() : INTEGER;
- BEGIN RETURN s * s END Area;
- END Square;
- VAR ExitCode : INTEGER;
- VAR shapes : ARRAY [0 .. 5] OF POINTER TO Shape;
- VAR a, b : POINTER TO Circle;
- VAR c, d : POINTER TO Square;
- VAR e : POINTER TO Circle;
- VAR f : POINTER TO Square;
- VAR line, num : ARRAY [0 .. 63] OF CHAR;
- VAR i, total : INTEGER;
- BEGIN
- ExitCode := 0;
- NEW(a); a^.SetR(3); (* 9 *)
- NEW(b); b^.SetR(5); (* 25 *)
- NEW(c); c^.SetS(4); (* 16 *)
- NEW(d); d^.SetS(6); (* 36 *)
- NEW(e); e^.SetR(2); (* 4 *)
- NEW(f); f^.SetS(7); (* 49 *)
- shapes[0] := a; shapes[1] := b; shapes[2] := c;
- shapes[3] := d; shapes[4] := e; shapes[5] := f;
- total := 0;
- i := 0;
- WHILE i <= 5 DO
- total := total + shapes[i]^.Area(); (* virtual dispatch *)
- INC(i)
- END;
- Conversions.IntToStr(total, num);
- line := "showcase18 areas sum=" + num;
- TextIO.WriteString(line);
- TextIO.WriteLn;
- IF total = 139 THEN ExitCode := 42 ELSE ExitCode := 1 END
- END Showcase18.
|