> -- AlexBogy писал(а):
> У меня к вам вопрос, как к уважаемому программисту-практику. В вашей практике встречалась необходимость в ваших модулях по каким-либо причинам использовать абстрактные типы записей (с абстрактными процедурами или без них) ?Я ничего не имею против абстрактных записей. Я прекрасно понимаю необходимость абстрактных процедур. У меня только один вопрос - с вашей точки зрения, какими причинами может быть вызван запрет на аллокацию экземпляра непосредственно абстрактной записи, а можно делать аллокацию только через наследника?
Да, часто использую, когда требуется один интерфейс и несколько реализаций под разные случаи. Тогда интерфейс как правило оформляется с ключевым словом ABSTRACT.

Вот примерчик, из программы над которой планирую корпеть дальше в январе. Решатель для многоуровневых систем.
## Код:
```
MODULE BioSolver;

   IMPORT BioModels, BioVectors, Meta;

   TYPE
      Force* = PROCEDURE(
            m: BioModels.Model;
            act: BioModels.Unit;
            OUT f: BioVectors.Vector
         );
   
      Solver* = POINTER TO ABSTRACT RECORD
         m*: BioModels.Model; (* модель *)
         f*: Force;  (* сила *)
      END;

      Factory* = POINTER TO ABSTRACT RECORD END;

   VAR
      factory: Factory;

   PROCEDURE (d: Factory) New* (par: POINTER TO ARRAY OF REAL): Solver, NEW, ABSTRACT;

   PROCEDURE (s: Solver) Step*, NEW, ABSTRACT;

   PROCEDURE New* (par: POINTER TO ARRAY OF REAL): Solver;
   BEGIN
      IF factory # NIL THEN
         RETURN factory.New(par)
      ELSE
         RETURN NIL
      END
   END New;

   PROCEDURE SetFactory* (f: Factory);
   BEGIN
      factory := f
   END SetFactory;

   PROCEDURE Load* (solverModule: ARRAY OF CHAR): BOOLEAN;
   VAR item: Meta.Item; proc: RECORD (Meta.Value) Install: PROCEDURE END; ok: BOOLEAN;
   BEGIN
      Meta.LookupPath(solverModule + ".Install", item);
      IF item.Valid() & (item.obj = Meta.procObj) THEN
         item.GetVal(proc, ok);
         IF ok THEN proc.Install;
            RETURN TRUE END
      END;
      RETURN FALSE
   END Load;

END BioSolver.
```
