OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 19 Март, 2024 05:14

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




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Абстракция и реализация
СообщениеДобавлено: Вторник, 23 Март, 2010 14:57 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
В моей задаче требуется получить некоторую информацию от ОС, заполнив глобальные переменные полученными значениями.
Для примера я взял
Код:
   VAR
      message-: Dialog.String;

Модуль при инициализации должен получить некоторое значение от ОС и поместить его в переменную message.
Прочтя раздел 3.4 в руководстве Блэкбокса (Design Practices: Object creation), я попытался создать модуль абстракций и модуль реализации (якобы платформо-зависимый). Но для получения переменной message мне нужно создать модель с помощью модель.dir.New() в коде клиента.

Как (если возможно) избавиться от Inf := ModelsCore.dir.New(); в коде клиента, перенеся внутрь реализации эту строку?

Код:
MODULE TestModelsCore;

   IMPORT Dialog;
   
   TYPE
      Info* = POINTER TO ABSTRACT RECORD END;
      Directory* = POINTER TO ABSTRACT RECORD END;
   
   VAR
      message-: Dialog.String;
      dir-, stdDir-: Directory;

   (** Directory **)

   PROCEDURE (d: Directory) New* (): Info, NEW, ABSTRACT;

   (* Info *)   

   PROCEDURE (I: Info) SetMessage* (IN mes: ARRAY OF CHAR), NEW;
   BEGIN
      message := mes$
   END SetMessage;

   PROCEDURE (I: Info) RetrieveInformation* (OUT mes: ARRAY OF CHAR), NEW, ABSTRACT;

   PROCEDURE (I: Info) InitMessage*, NEW;
      VAR mes: Dialog.String;
   BEGIN
      I.RetrieveInformation(mes);
      I.SetMessage(mes$)
   END InitMessage;

   PROCEDURE SetDir* (d: Directory);
   BEGIN
      ASSERT(d # NIL, 20);
      dir := d;
      IF stdDir = NIL THEN stdDir := d END
   END SetDir;
   
END TestModelsCore.


Код:
MODULE TestModelsHost;

   IMPORT Kernel, ModelsCore := TestModelsCore;
      
   TYPE
      Info = POINTER TO RECORD (ModelsCore.Info) END;
      Directory = POINTER TO RECORD (ModelsCore.Directory) END;
   
   VAR
      dir: Directory;
   
   (* Implementation *)
   
   PROCEDURE (I: Info) RetrieveInformation (OUT mes: ARRAY OF CHAR);
   BEGIN
      mes := "Hello!"
   END RetrieveInformation;
   
   (* Directory *)
   PROCEDURE (d: Directory) New (): Info;
   VAR Inf: Info;
   BEGIN
      NEW(Inf);
      Inf.InitMessage;
      RETURN Inf
   END New;
   
   PROCEDURE Init;
   BEGIN
      NEW(dir);
      ModelsCore.SetDir(dir)
   END Init;
   
BEGIN
   Init
END TestModelsHost.


Код:
MODULE TestModels;

   IMPORT ModelsHost := TestModelsHost, ModelsCore := TestModelsCore, Log := StdLog;
   
   PROCEDURE Do*;
      VAR Inf: ModelsCore.Info;
   BEGIN
      Inf := ModelsCore.dir.New();
      Log.String(ModelsCore.message); Log.Ln;
      Inf.SetMessage ("Hello, world!");
      Log.String(ModelsCore.message); Log.Ln
   END Do;
   
END TestModels.

^Q TestModels.Do

Вложение:
TestModels.zip [2.34 КБ]
Скачиваний: 384


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Абстракция и реализация
СообщениеДобавлено: Вторник, 23 Март, 2010 15:07 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2449
Откуда: Россия, Томск
Роман М. писал(а):
Как (если возможно) избавиться от Inf := ModelsCore.dir.New(); в коде клиента, перенеся внутрь реализации эту строку?
Этот вызов достаточно переместить в TestModelsHost.Init. Тогда информация будет проинициализирована при загрузке модуля реализации (вы ведь в любом случае прилинкуете TestModelsHost к приложению). Главное - убедиться, что модуль TestModelsHost будет загружен до того, как кому-то потребуется информация из TestModelsCore.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Абстракция и реализация
СообщениеДобавлено: Вторник, 23 Март, 2010 17:20 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Насколько я понимаю,
Код:
PROCEDURE (d: Directory) New* (): Info
вообще излишня, потому что нужно только инициировать глобальные переменные. Значит, можно переместить код
Код:
      NEW(Inf);
      Inf.InitMessage;
сразу после установки директории SetDir в TestModelsHost.Init.


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

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


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

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


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

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