Экспорт "только для реализации" в Oberon-2 сделать не получится.

EXTENSIBLE - таковы все записи в Oberon-2.

"Final" - не расширяемая запись. Скорее всего, не получится реализовать.

Абстрактный метод - это метод с телом, состоящим из единственного вызова HALT.

ABSTRACT - имеющий в реализации всех методов обязательный вызов абстрактного экспортированного метода Abstract.

LIMITED - аналогично ABSTRACT, но метод Abstract не экспортирован.

Получается, что абстрактные записи обязательно должны иметь методы, при вызове которых сработает сигнализация. А как быть с записями, которые состоят только из данных? Зачем их делать абстрактными? Чтобы гарантировать корректную инициализацию перед использованием (представьте, что все данные скрыты, не экспортированы). В этом случае использующие процедуры (которые фактически являются методами, хоть и не объявлены таковыми текстуально) должны контролировать инициализированность записи. Ведь если просто сделать NEW() или объявить запись локальной переменной, то в ней будет мусор, и использовать до инициализации её нельзя. Особенно остро вопрос стоит для компилятора XDS, который иногда забывает занулить указатели в стековом объекте. Решением будет создание метода Init, который будет приводить новый объект в корректное состояние, и одновременно запоминать указатель на объект в скрытом поле "self" самого объекта. При использовании объекта достаточно проверить совпадение адреса объекта с содержимым поля "self". Конечно, есть некоторый шанс, что случайным мусором в памяти как раз на месте поля self окажется как раз адрес объекта. Понизить шанс такого совпадения можно использованием более длинной структуры данных и помещения в неё некого хэша от адреса объекта. А всё для чего? Ради того, чтобы программист не забыл вызвать метод Init.

Самое неприятное во всём этом - то, что обнаружится неправильность реализации только во время выполнения, а значит, в непредсказуемый момент времени, и проследить проблему до источника может оказаться не просто.