Кажется, я придумал, как создавать абстрактные объекты в Oberon-2 (ключевое слово ABSTRACT в КП). Это несколько более трудоёмко, и нет поддержки времени компиляции, но добиться рантайм-поддержки можно.
Для этого создаём объект с методом Abstract:
Код:
PROCEDURE (obj: Object) Abstract*;
BEGIN
HALT(127) (* not implemented *)
END Abstract;
Все прочие методы объекта должны первым делом всегда вызывать этот метод Abstract. В этом случае при обращении к любому методу объекта будет происходить аварийное завершение работы, и единственным способом избавиться от этого будет перекрыть либо метод Abstract (просто обезвредить его, сделав пустым), либо перекрыть все остальные методы, чтобы они не вызывали опасный Abstract. В обоих случаях потребуется создать новый тип, который не будет абстрактным, что и требовалось. Ведь главная задача признака "абстрактности" - предотвращение оборота непроинициализированных объектов.
Так реализованный признак абстрактности можно по желанию сохранять в наследнике.
Аналогично можно реализовать объект с атрибутом LIMITED. Для этого достаточно метод Abstract (можно назвать его Limited) не экспортировать, и перекрывать только во внутренних, не экспортированных расширениях. Извне перекрыть его будет невозможно, и чужие расширения будут приводить в действие "сигнализацию" при попытке использования такого объекта.
Надо ещё подумать про экспорт "только для реализации", пустые методы и признак EXTENSIBLE. Сейчас времени нет, убегаю.