Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Oberon
Перезагрузить страницу Экспорт метода только для реализации
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию Экспорт метода только для реализации - 03.11.2005, 13:08

А как надо было сделать?</span>
Чтобы не попасть в описанную здесь ловушку, в модуле Stores надо было с самого начала сделать примерно так:
Код:
    WriteMsg = LIMITED RECORD
      wr-: Writer
    END;

    ReadMsg = LIMITED RECORD
      rd-: Reader
    END;

    StoreAsMsg = LIMITED RECORD
      s: Store
    END;

    Store = POINTER TO ABSTRACT RECORD 
      ...
      (s: Store) Externalize (VAR msg: WriteMsg), NEW, EXTENSIBLE;
      (s: Store) ExternalizeAs (VAR msg: StoreAsMsg), NEW, EMPTY;
      (s: Store) Internalize (VAR msg: ReadMsg), NEW, EXTENSIBLE
    END;
Поскольку типы WriteMsg, ReadMsg и StoreAsMsg объявлены с модификатором LIMITED, то разместить переменные этих типов в каком-либо другом модуле кроме модуля Stores нельзя. А раз нельзя заполучить переменные этих типов, то и нельзя вызвать методы Externalize, ExternalizeAs и Internalize. В тоже самое время, внутри методов Externalize, ExternalizeAs и Internalize можно сделать супер-вызов методов предка передав им в качестве аргумента свой аргумент:
Код:
  PROCEDURE (m: Model) Externalize* (VAR msg: Stores.WriteMsg), EXTENSIBLE;
  BEGIN
    m.Externalize^(msg); (* Супер-вызов метода с аргуметом msg: Stores.WriteMsg *)
    ...
  END Externalize;
Так что, всё просто решается: методы Externalize, ExternalizeAs и Internalize фактически экспортированы только для реализации (т.к. для того чтобы их вызвать нужно откуда-то раздобыть переменные типов WriteMsg, ReadMsg и StoreAsMsg, которые <span style="color:blue">LIMITED
методов предка можно!
Ответить с цитированием
  (#2 (permalink)) Старый
Ivor Ivor вне форума
Новичок
 
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 01.08.2005
По умолчанию Re: Экспорт метода только для реализации "-". - 03.11.2005, 14:08

Цитата:
Originally posted by S.Yu.Gubanov
[b]Методы Externalize, ExternalizeAs и Internalize экспортируются только для реализации. Оно и понятно, ведь вызов этих методов имеет смысл только в рамках модуля Stores в процессе сохранения/загрузки объектов. Вызов этих методов в каком-либо другом контексте может привести к не предсказуемым последствиям - к нарушению целостности системы объектов.
Позвольте, но в этих методах можно только читать/писать. Как при этом нарушается целостность системы? А уж метод CopyFrom "только для реализации" - вообще нонсенс! Я бы убрал такую возможность из языка - по-моему перебор это.
Ответить с цитированием
  (#3 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию Re: Экспорт метода только для реализации "-". - 03.11.2005, 15:05

Цитата:
Originally posted by Ivor
[b]Позвольте, но в этих методах можно только читать/писать. Как при этом нарушается целостность системы? А уж метод CopyFrom "только для реализации" - вообще нонсенс!
Методы Internalize и CopyFrom можно применять исключительно только к чистому объекту т.е. к только что созданному еще не инициализированному объекту! К примеру, что если этот уже инициализированный объект держал некий системный ресурс. После выполнения метода Internalize или CopyFrom, этот объект был бы проинициализирован заново как с чистого листа. Захваченный им ранее системный ресурс остался бы не освобождённым. Еще бывают такие специальные виды объектов, которые нельзя изменять после их создания (пример: TextModels.Attributes), т. е. их можно инициализировать только один раз. Методы Internalize и CopyFrom как раз и осуществляют инициализацию. Поэтому если бы методы Internalize и CopyFrom были бы доступны для вызова кем угодно, то невозможно было бы гарантировать неизменяемость таких объектов - их состояние мог бы изменить кто угодно и когда угодно просто вызвав бы CopyFrom!
Ответить с цитированием
  (#4 (permalink)) Старый
Ivor Ivor вне форума
Новичок
 
Сообщений: 4
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 01.08.2005
По умолчанию Re: Экспорт метода только для реализации "-". - 03.11.2005, 16:11

Цитата:
Originally posted by S.Yu.Gubanov+-->
Цитата:
Методы Internalize и CopyFrom можно применять исключительно только к чистому объекту т.е. к только что созданному еще не инициализированному объекту! К примеру, что если этот уже инициализированный объект держал некий системный ресурс.
А ничего страшного не произойдёт. Потому как захваченные ресурсы освободятся внутри методов Internalize и CopyFrom (а если нет - руки править надо). Зато я могу не изобретать метод AssignFrom.

<!--QuoteBegin-S.Yu.Gubanov

[b]Еще бывают такие специальные виды объектов, которые нельзя изменять после их создания (пример: TextModels.Attributes), т. е. их можно инициализировать только один раз. Методы Internalize и CopyFrom как раз и осуществляют инициализацию. Поэтому если бы методы Internalize и CopyFrom были бы доступны для вызова кем угодно, то невозможно было бы гарантировать неизменяемость таких объектов - их состояние мог бы изменить кто угодно и когда угодно просто вызвав бы CopyFrom!
А эти объекты нельзя править только потому, что система так спроектирована. Никаких теоретических препятствий к изменению подобных объектов я не вижу.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите концепцию реализации Ma7 Вопросы начинающих программистов 0 04.09.2011 17:48
технология реализации административного интерфейса allba PHP 3 28.02.2011 17:07
Выбор способа реализации продукта explosive Сетевое программирование 0 23.09.2008 22:24
Написать программу Реализации сбаланисированного дерева Bortel Lisp 2 28.06.2007 13:54
Помогите найти ошибку в реализации Soltar Prolog 1 29.10.2006 15:01
Как получить в теле метода имя метода imported_nostromo Smalltalk 2 19.07.2006 13:00
Как собраться с мыслями для реализации программы Алексеев Николай Мысли вслух 10 05.12.2004 17:05
Где найти информацию о реализации, менеджера памяти ReMY Assembler 0 12.11.2004 13:09
Как написать код реализации стэка на C++ Anonymous Вопросы начинающих программистов 4 06.11.2004 18:29
Как напечатать Memo только что бы печатался не только текст но его размер, ширифт Trus Delphi 2 01.06.2004 00:40
Циклоидный итератор-хеш - тонкости реализации Yttrium С/С++ 6 09.04.2004 01:38
Выбор средства реализации программки polysemantic Общие вопросы программирования 0 30.09.2003 18:14



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов