OberonCore https://forum.oberoncore.ru/ |
|
Абстрактные объекты в Oberon-2 https://forum.oberoncore.ru/viewtopic.php?f=30&t=2987 |
Страница 1 из 1 |
Автор: | Александр Ильин [ Четверг, 11 Ноябрь, 2010 16:54 ] |
Заголовок сообщения: | Абстрактные объекты в Oberon-2 |
Кажется, я придумал, как создавать абстрактные объекты в Oberon-2 (ключевое слово ABSTRACT в КП). Это несколько более трудоёмко, и нет поддержки времени компиляции, но добиться рантайм-поддержки можно. Для этого создаём объект с методом Abstract: Код: PROCEDURE (obj: Object) Abstract*; BEGIN HALT(127) (* not implemented *) END Abstract; Все прочие методы объекта должны первым делом всегда вызывать этот метод Abstract. В этом случае при обращении к любому методу объекта будет происходить аварийное завершение работы, и единственным способом избавиться от этого будет перекрыть либо метод Abstract (просто обезвредить его, сделав пустым), либо перекрыть все остальные методы, чтобы они не вызывали опасный Abstract. В обоих случаях потребуется создать новый тип, который не будет абстрактным, что и требовалось. Ведь главная задача признака "абстрактности" - предотвращение оборота непроинициализированных объектов. Так реализованный признак абстрактности можно по желанию сохранять в наследнике. Аналогично можно реализовать объект с атрибутом LIMITED. Для этого достаточно метод Abstract (можно назвать его Limited) не экспортировать, и перекрывать только во внутренних, не экспортированных расширениях. Извне перекрыть его будет невозможно, и чужие расширения будут приводить в действие "сигнализацию" при попытке использования такого объекта. Надо ещё подумать про экспорт "только для реализации", пустые методы и признак EXTENSIBLE. Сейчас времени нет, убегаю. |
Автор: | Евгений Темиргалеев [ Четверг, 11 Ноябрь, 2010 18:32 ] |
Заголовок сообщения: | Re: Абстрактные объекты в Oberon-2 |
Александр Ильин писал(а): Надо ещё подумать про экспорт "только для реализации", пустые методы и признак EXTENSIBLE. Сейчас времени нет, убегаю. Разве пустые это не просто Код: PROCEDURE (obj: Object) Method*; BEGIN END Method; ![]() |
Автор: | Александр Ильин [ Четверг, 11 Ноябрь, 2010 19:49 ] |
Заголовок сообщения: | Re: Абстрактные объекты в Oberon-2 |
Нашёл нестыковку в документации Docu/CP-New.odc: Цитата: EMPTY methods
A method can be declared as empty. Empty methods are extensible. An empty method is very similar to an abstract method, in that it is a hook for functionality that can be provided in later extensions. However, empty methods are concrete and can be called. If they have not been extended (i.e., implemented), calling them has no effect. Empty methods represent optional interfaces. For example, a BlackBox Component Framework View provides an empty method for handling user events (HandleCtrlMsg). This method is implemented in interactive views, passive views ignore it. It is not possible to introduce code in an empty procedure. For this reason, an empty method has no corresponding procedure body, and may not be called via super calls. |
Автор: | Александр Ильин [ Четверг, 11 Ноябрь, 2010 19:50 ] |
Заголовок сообщения: | Re: Абстрактные объекты в Oberon-2 |
Евгений Темиргалеев писал(а): Разве пустые это не просто... :?: Да, точно. Я имел в виду абстрактные методы.
|
Автор: | Александр Ильин [ Четверг, 11 Ноябрь, 2010 20:29 ] |
Заголовок сообщения: | Re: Абстрактные объекты в Oberon-2 |
Экспорт "только для реализации" в Oberon-2 сделать не получится. EXTENSIBLE - таковы все записи в Oberon-2. "Final" - не расширяемая запись. Скорее всего, не получится реализовать. Абстрактный метод - это метод с телом, состоящим из единственного вызова HALT. ABSTRACT - имеющий в реализации всех методов обязательный вызов абстрактного экспортированного метода Abstract. LIMITED - аналогично ABSTRACT, но метод Abstract не экспортирован. Получается, что абстрактные записи обязательно должны иметь методы, при вызове которых сработает сигнализация. А как быть с записями, которые состоят только из данных? Зачем их делать абстрактными? Чтобы гарантировать корректную инициализацию перед использованием (представьте, что все данные скрыты, не экспортированы). В этом случае использующие процедуры (которые фактически являются методами, хоть и не объявлены таковыми текстуально) должны контролировать инициализированность записи. Ведь если просто сделать NEW() или объявить запись локальной переменной, то в ней будет мусор, и использовать до инициализации её нельзя. Особенно остро вопрос стоит для компилятора XDS, который иногда забывает занулить указатели в стековом объекте. Решением будет создание метода Init, который будет приводить новый объект в корректное состояние, и одновременно запоминать указатель на объект в скрытом поле "self" самого объекта. При использовании объекта достаточно проверить совпадение адреса объекта с содержимым поля "self". Конечно, есть некоторый шанс, что случайным мусором в памяти как раз на месте поля self окажется как раз адрес объекта. Понизить шанс такого совпадения можно использованием более длинной структуры данных и помещения в неё некого хэша от адреса объекта. А всё для чего? Ради того, чтобы программист не забыл вызвать метод Init. Самое неприятное во всём этом - то, что обнаружится неправильность реализации только во время выполнения, а значит, в непредсказуемый момент времени, и проследить проблему до источника может оказаться не просто. |
Автор: | igor [ Пятница, 12 Ноябрь, 2010 08:07 ] |
Заголовок сообщения: | Re: Абстрактные объекты в Oberon-2 |
Вопрос чисто из любопытства. А зачем из одного языка (Оберон-2) делать другой (КП)? Ведь КП и так есть, готовенький. ![]() |
Автор: | Илья Ермаков [ Пятница, 12 Ноябрь, 2010 12:58 ] |
Заголовок сообщения: | Re: Абстрактные объекты в Oberon-2 |
В принципе, частая задача - при отсутствии в некотором инструменте статических механизмов для контроля каких-то инвариантов организовать хотя бы динамическую их проверку (когда оно реально нужно). |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |