Спасибо! Да, я примерно так и представлял. Непонятно вот что: есть модуль, в котором описаны абстрактные типы, они экспортируются, в т.ч. их абстрактные методы:
TYPE Rec*=POINTER TO ABSTRACT RECORD END;
TYPE RecSet*=POINTER TO RECORD
r*:POINTER TO ARRAY OF Rec;
END;
PROCEDURE (r:Rec) Do* (), NEW, ABSTRACT;

В других модулях реализуем их, но не экспортируем.
Еще один модуль реализует работу (например, математику) со списком объектов, которые являются наследниками абстрактного типа, но они могут быть разными его реализациями (он импортирует первый модуль):
PROCEDURE DoMath* (rs:RecSet);
VAR i:INTEGER;
BEGIN
FOR i:=0 TO LEN(r)-1 DO
rs.r[i].Do;
END;
END DoMath;
(предполагаем, что rs где-то заполнился конкретными r разных типов)
Это будет работать? Или я что-то неправильно делаю, с т.з. архитектуры?