Любой RECORD является объектом, если к нему добавить методы, т.е. "связанные процедуры". Пример:
## Код:
```
TYPE Object = POINTER TO EXTENSIBLE RECORD x, y: INTEGER END;
PROCEDURE (self: Object) SetCoords* (x, y: INTEGER), NEW;
BEGIN
   self.x := x;
   self.y := y
END SetCoords;
```

Наследование называется "расширением типа" (type extension). Пример:
## Код:
```
TYPE ExtendedObject = POINTER TO EXTENSIBLE RECORD (Object) z: INTEGER END;
PROCEDURE (self: ExtendedObject) SetAll (x, y, z: INTEGER), NEW;
BEGIN
   self.SetCoords(x, y);
   self.z := z
END SetAll;
```

Если какой-то тип хотите сделать нерасширяемым (final), не указывайте слово EXTENSIBLE.

Хорошее описание языка и ООП с примерами есть в книге Вирта"Programming in Oberon", см. последюю главу. Там и шина сообщений описана. Немногочисленные отличия Компонентного Паскаля от Оберона описаны в документе Docu/CP-New.odc в любом комплекте Блэкбокса.