TYPE
Proc = POINTER TO ProcDesc; (* класс процедур *)
ProcDesc = RECORD
id : INTEGER; (* номер реализации *)
next: Proc; (* ссылка на следующий *)
END;
Pas = POINTER TO PasDesc;
(* класс процедур для треугольника Паскаля *)
Fib = POINTER TO FibDesc;
(* класс процедур для чисел Фибоначчи *)
PasDesc = RECORD (ProcDesc) proc: Pascaline.ProcType1
END;
FibDesc = RECORD (ProcDesc) proc: Pascaline.ProcType2
END;
List = RECORD (* неоднородный список *)
first: Proc; (* первый элемент *)
this : Proc; (* текущий элемент *)
END;
PROCEDURE ExecThisProc* (VAR isPas: BOOLEAN;
VAR id: INTEGER; VAR p1,p2,f1: SHORTINT;
VAR result: LONGINT);
BEGIN
IF (list.this # NIL) THEN
IF (list.this IS Pas)
(* проверяем динамический тип *) THEN
isPas := TRUE; id := list.this^.id;
result := list.this(Pas)^.proc(pas1,pas2)
(* приводим к типу *)
ELSIF (list.this IS Fib)
(* проверяем динамический тип *) THEN
isPas := FALSE; id := list.this^.id;
result := list.this(Fib)^.proc(fib1)
(* приводим к типу *)
END;
p1 := pas1; p2 := pas2; f1 := fib1;
END;
END ExecThisProc;

назад