Информационный сервер для программистов: Исходники со всего света. Паскальные исходники со всего света
  Powered by Поисковый сервер Яndex: Найдется ВСЁ!
На Главную Pascal Форум Информер Страны мира
   Статьи о Паскале
   
 

Мир ПК, #07/2001


Вернуться к статье

Листинг 10. Модуль TriangleTst.
Динамические типы, классы, неоднородные списки

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;

Вернуться к статье