> -- prospero78 писал(а):
> Хорошо. Вопрос в догонку. Я наследую через указатель -- указатель на расширяемую запись.1. Так можно?2. Как базовому указателю грамотно NEW устроить?

Вот старый примерчик. Вроде бы он был по книге:
Фримен Э. и др. Паттерны проектирования. Санкт-Петербург: Питер, 2011. 656 с.

Тут не только фабрика, но и еще "нечто" в стиле ББ.
## Код:
```
MODULE MyTest;
   IMPORT  Log;
   
   TYPE
      Animal = POINTER TO ABSTRACT RECORD
         next: Animal
      END;
      Cat = POINTER TO RECORD (Animal) END;
      Dog = POINTER TO RECORD (Animal) END;
      Directory = POINTER TO RECORD
         root: Animal
      END;

   VAR
      dir: Directory;

   PROCEDURE (d: Directory) Add (a: Animal), NEW;
   VAR tmp: Animal;
   BEGIN
      IF d.root = NIL THEN
         d.root := a
      ELSE
         tmp := d.root;
         WHILE tmp.next # NIL DO tmp := tmp.next END;
         tmp.next := a
      END
   END Add;
   
   PROCEDURE (a: Animal) FeedMilk, NEW, ABSTRACT;
   
   PROCEDURE (a: Cat) FeedMilk;
   BEGIN
      Log.String("Mmm!"); Log.Ln;
   END FeedMilk;
   
   PROCEDURE (a: Dog) FeedMilk;
   BEGIN
      Log.String("No thanks!"); Log.Ln;
   END FeedMilk;
   
   (* Фабрика объетов *)
   PROCEDURE (d: Directory) New (type: INTEGER): Animal, NEW;
   VAR a: Animal; cat: Cat; dog: Dog;
   BEGIN
      CASE type OF 1:
         NEW(cat);
         a := cat;
      | 2 : 
         NEW(dog);
         a := dog;
      ELSE END;
      dir.Add(a);
      
      RETURN a
   END New;
   
   PROCEDURE Test*;
      VAR a: Animal;
   BEGIN
      dir.root := NIL;
      (* add animals *)
      a := dir.New(1);
      a := dir.New(2);
      
      a := dir.root;
      WHILE a # NIL DO
         a.FeedMilk;
         a := a.next
      END
   END Test;

BEGIN
   NEW(dir);
   
END MyTest.

MyTest.Test
```
