{$e err.log.text}
UNIT TestClass; intrinsic  shared;

   INTERFACE

      TYPE
         ptr    = ^integer;

         Class1 = SUBCLASS OF nil
                     Class1Id: Integer;
                     Class2Id, Class3Id: Integer;
                     FUNCTION class1.create: Class1;
                     PROCEDURE Proc1; abstract;
                     PROCEDURE class1.Proc2; abstract;
                     FUNCTION class1.FunC1(i: Integer): Class1;
                  END;

         Class2 = SUBCLASS OF Class1
                     Field1, Field2: Integer;
                     Field3: Integer;
                     Field4: Class1;
                     FUNCTION create: Class2;
                     PROCEDURE Proc1; Override;         {override of class1 proc}
                     PROCEDURE class2.Proc2; Override;
                     PROCEDURE Proc3(i: integer);
                     PROCEDURE Proc4;
                     FUNCTION class2.FunC2(i: integer): Class1;
                  END;

    VAR i, j: LongInt;

    FUNCTION GardenVariety(i: integer; j: longint; k: ptr): integer;

   IMPLEMENTATION

     FUNCTION GardenVariety(i: integer; j: longint; k: ptr): integer;
        BEGIN END;

     METHODS OF Class1;

        FUNCTION class1.create: Class1;
           BEGIN {Create}
           END; {Create}
        (*
        PROCEDURE Proc1;
           BEGIN {Proc1}
           END; {proc1}
         *)
        FUNCTION class1.FunC1(i: Integer): Class1;
           BEGIN
           END;

        BEGIN
           i := 1;
        END;

     METHODS OF Class2

        FUNCTION create: Class2;

           var
              c1: class1;
              c2: class2;
              i: integer;
              p: ptr;
              b: boolean;

           BEGIN {Create}
              self := c2;
              p := thisclass;
              i := GardenVariety(1, 2, thisclass);
              b := inclass(c1, class1);
              b := inclass(c2, class2);
              b := inclass(class1.func1(1), class2);
           END; {Create}

        PROCEDURE {class2 override} class2.Proc1;
           BEGIN {Proc1 override}
           END; {Proc1}

        PROCEDURE class2.Proc2;

           VAR
              c1: class1;
              c2: class2;

           PROCEDURE InnerToProcs;
              BEGIN
              END;

           BEGIN {Proc2}
              c1 := class1(c2);
              WITH class1(c2) do
                 class1id := 1;
              with c1 do
                 class1id := 1;
           END; {Proc2}

        PROCEDURE Proc3;

           Var
              c1: class1;
              c2: class2;

           BEGIN {Proc3}
              Class1.Proc1;
              Class2.Proc1;
              Class2.Proc2;
              c1 := Class1.Create;
              c2 := Class2.Create;
              c1.proc1;
              c2.proc1;
              c2.proc2;
              c2.proc3(1);
              c2 := class2(c1);
           END; {Proc3}

        PROCEDURE class2.Proc4;
           BEGIN {Proc4}
           END; {Proc4}

        FUNCTION class2.FunC2(i: integer): Class1;
           BEGIN
              FunC2 := self.field4.FunC1(self.field1);
           END;
     END;

END.

