OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 28 Апрель, 2024 12:59

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Абстрактные объекты в Oberon-2
СообщениеДобавлено: Четверг, 11 Ноябрь, 2010 16:54 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Кажется, я придумал, как создавать абстрактные объекты в Oberon-2 (ключевое слово ABSTRACT в КП). Это несколько более трудоёмко, и нет поддержки времени компиляции, но добиться рантайм-поддержки можно.

Для этого создаём объект с методом Abstract:
Код:
PROCEDURE (obj: Object) Abstract*;
BEGIN
   HALT(127) (* not implemented *)
END Abstract;

Все прочие методы объекта должны первым делом всегда вызывать этот метод Abstract. В этом случае при обращении к любому методу объекта будет происходить аварийное завершение работы, и единственным способом избавиться от этого будет перекрыть либо метод Abstract (просто обезвредить его, сделав пустым), либо перекрыть все остальные методы, чтобы они не вызывали опасный Abstract. В обоих случаях потребуется создать новый тип, который не будет абстрактным, что и требовалось. Ведь главная задача признака "абстрактности" - предотвращение оборота непроинициализированных объектов.

Так реализованный признак абстрактности можно по желанию сохранять в наследнике.

Аналогично можно реализовать объект с атрибутом LIMITED. Для этого достаточно метод Abstract (можно назвать его Limited) не экспортировать, и перекрывать только во внутренних, не экспортированных расширениях. Извне перекрыть его будет невозможно, и чужие расширения будут приводить в действие "сигнализацию" при попытке использования такого объекта.

Надо ещё подумать про экспорт "только для реализации", пустые методы и признак EXTENSIBLE. Сейчас времени нет, убегаю.


Последний раз редактировалось Александр Ильин Четверг, 11 Ноябрь, 2010 19:55, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Абстрактные объекты в Oberon-2
СообщениеДобавлено: Четверг, 11 Ноябрь, 2010 18:32 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Александр Ильин писал(а):
Надо ещё подумать про экспорт "только для реализации", пустые методы и признак EXTENSIBLE. Сейчас времени нет, убегаю.
Разве пустые это не просто
Код:
PROCEDURE (obj: Object) Method*; BEGIN END Method;
:?:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Абстрактные объекты в Oberon-2
СообщениеДобавлено: Четверг, 11 Ноябрь, 2010 19:49 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Нашёл нестыковку в документации 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.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Абстрактные объекты в Oberon-2
СообщениеДобавлено: Четверг, 11 Ноябрь, 2010 19:50 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Евгений Темиргалеев писал(а):
Разве пустые это не просто... :?:
Да, точно. Я имел в виду абстрактные методы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Абстрактные объекты в Oberon-2
СообщениеДобавлено: Четверг, 11 Ноябрь, 2010 20:29 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Экспорт "только для реализации" в Oberon-2 сделать не получится.

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

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

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

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

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

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Абстрактные объекты в Oberon-2
СообщениеДобавлено: Пятница, 12 Ноябрь, 2010 08:07 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Вопрос чисто из любопытства. А зачем из одного языка (Оберон-2) делать другой (КП)? Ведь КП и так есть, готовенький. :) Не устраивают имеющиеся компиляторы с КП?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Абстрактные объекты в Oberon-2
СообщениеДобавлено: Пятница, 12 Ноябрь, 2010 12:58 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
В принципе, частая задача - при отсутствии в некотором инструменте статических механизмов для контроля каких-то инвариантов организовать хотя бы динамическую их проверку (когда оно реально нужно).


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 20


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB