home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD 45 / SuperCD45.iso / talleres / prog_alternat / Obs / OBS.MOD
Text File  |  1999-10-25  |  2KB  |  90 lines

  1. MODULE Obs;
  2.  
  3. (* Oberon program demonstrating OOP using extensible records *)
  4.  
  5. IMPORT In,Out,Strings;
  6.  
  7. TYPE
  8.    ST50 = ARRAY 50 OF CHAR;
  9.    
  10.  
  11.    (* someR is the base record                               *)
  12.    someR = RECORD
  13.      datatype : ST50;
  14.    END;
  15.  
  16.    (* intR and chR are descendants of the base record        *)
  17.    intR = RECORD(someR)
  18.        i : INTEGER;
  19.    END;
  20.  
  21.    chR = RECORD(someR);
  22.        c : CHAR;
  23.    END;
  24.  
  25.  
  26. PROCEDURE Test2( VAR obR : someR );
  27. BEGIN
  28.   (* Check the actual type of the record parameter using the 
  29.      IS operator. Note that IS can only be used with a 
  30.      pointer to a variable or, as here, with a VAR parameter *)
  31.   IF obR IS chR THEN 
  32.      Out.String( "It's a char! - " );
  33.      Out.Char( obR(chR).c );     
  34.      Out.Ln;
  35.   ELSIF obR IS intR THEN
  36.      Out.String( "It's an integer! - " );
  37.      Out.Int( obR(intR).i, 2 );  
  38.      Out.Ln;
  39.   ELSE
  40.     Out.String( "It's something else!" );
  41.     Out.Ln;
  42.   END;
  43. END Test2;
  44.  
  45.  
  46. PROCEDURE Test1( VAR obR : someR );
  47. (* Find the data type by examining the datatype field        *)
  48. BEGIN
  49.   IF obR.datatype = 'chR' THEN 
  50.      Out.String( "It's a char! - " );
  51.      Out.Char( obR(chR).c );     
  52.      Out.Ln;
  53.   ELSIF obR.datatype = 'intR' THEN
  54.      Out.String( "It's an integer! - " );
  55.      Out.Int( obR(intR).i, 2 );  
  56.      Out.Ln;
  57.   ELSE
  58.     Out.String( "It's something else!" );
  59.     Out.Ln;     
  60.   END; 
  61. END Test1;
  62.  
  63. PROCEDURE ProgMain*;
  64. VAR
  65.   sr : someR;
  66.   ir : intR;
  67.   cr : chR;
  68. BEGIN
  69.   (* Initialise the fields of the 3 record variables         *)
  70.   sr.datatype := 'someR';
  71.   ir.datatype := 'intR';
  72.   ir.i := 100;
  73.   cr.datatype := 'chR';
  74.   cr.c := 'X';
  75.   (* First, pass the 3 types of record variable to Test1()   *)
  76.   Out.String( 'Test1' );
  77.   Out.Ln;
  78.   Test1( sr );
  79.   Test1( ir ); 
  80.   Test1( cr );
  81.   (* Then, pass the same 3 record variables to Test2()       *)
  82.   Out.String( 'Test2' );
  83.   Out.Ln;
  84.   Test2( sr );
  85.   Test2( ir ); 
  86.   Test2( cr );
  87. END ProgMain;
  88.  
  89. END Obs.
  90.