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

Предлагаю обсудить на сколько безумным является описанное ниже расширение языка программирования Component Pascal.

Сначала посмотрите текст программы:
Код:
DEFINITION Canonical;

  TYPE
    Object = POINTER TO ABSTRACT RECORD 
      (this: Object) Handle (VAR msg: Message), NEW, EMPTY
    END;

    Message = ABSTRACT RECORD  END;

END Canonical.
Код:
DEFINITION Foo;

  IMPORT Canonical;

  TYPE
    MsgA = RECORD (Canonical.Message)
      ...
    END;

    MsgB = RECORD (Canonical.Message)
      ...
    END;

    PROCEDURE DoSmth (obj: Canonical.Object{MsgA, MsgB});

END Foo.
Код:
DEFINITION Bar;

  IMPORT Canonical;

  TYPE
    MsgA = RECORD (Canonical.Message)
      ...
    END;

    MsgB = RECORD (Canonical.Message)
      ...
    END;

    MyTypeOfObject = Canonical.Object{MsgA, MsgB};

    PROCEDURE DoSmth (obj: MyTypeOfObject);

END Bar.
Код:
DEFINITION X;

  IMPORT Canonical, Foo, Bar;

  TYPE
    Obj = POINTER TO RECORD (Canonical.Object) {Foo.MsgA, Foo.MsgB, Bar.MsgA, Bar.MsgB}
      ...
    END;

END X.
Что означает этот текст?
Во-первых, предположим, что Canonical - это псевдомодуль "вшитый" в компилятор.
Во-вторых, запись в фигурных скобках {MsgA, MsgB} множества имен типов сообщений (расширений от Canonical.Message) означает для компилятора следующее:
1) При определении нового типа расширения от Canonical.Object, явное перечисление множества имен типов сообщений есть заявление делаемое программистом о том, что этот тип объектов гарантированно умеет обрабатывать перечисленные сообщения. То есть текст:
Код:
  TYPE
    Obj = POINTER TO RECORD (Canonical.Object) {Foo.MsgA, Foo.MsgB, Bar.MsgA, Bar.MsgB}
      ...
    END;
явно дает компилятору информацию о том, что Obj умеет обрабатывать перечисленные в фигурных скобках сообщения.
2) При объявлении синонима некоего исходного типа:
Код:
  TYPE 
    P = Canonical.Object{MsgA, MsgB};
    Q = SomeType{MsgA, MsgB}; (* SomeType - это некое расширение типа Canonical.Object*)
или безымянного типа:
Код:
  PROCEDURE DoSmth (obj: Canonical.Object{MsgA, MsgB});
  PROCEDURE DoSmth (obj: SomeType{MsgA, MsgB}); (* SomeType - это некое расширение типа Canonical.Object*)
это обозначает, что объекты этого типа помимо всех свойств исходного типа дополнительно еще умеют (должны уметь) обрабатывать перечисленные в фигурных скобках сообщения.

Таким образом компилятору становится доступна дополнительная информация благодаря которой можно осуществлять более строгий контроль типов во время компиляции. В языках программирования Delphi, Java и C# аналогичный эффект достигается с помощью схемы interface. В языке Zonnon аналогичный эффект достигается с помощью схемы definition. Схема прямого объявления множества обрабатываемых сообщений является альтернативой для interface & definition.
Ответить с цитированием
  (#2 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию Re: Множество сообщений как альтернатива interface - 02.11.2005, 13:34

Пример:
Код:
DEFINITION Stores; 

  IMPORT Canonical; 

  TYPE 
    Externalize = LIMITED RECORD (Canonical.Message) 
      writer-: Writer; 
      ... 
    END; 

    Internalize = LIMITED RECORD (Canonical.Message) 
      reader-: Reader; 
      ... 
    END; 

    Store = Canonical.Object{Externalize, Internalize};

    Reader = LIMITED RECORD 
      ... 
      (VAR rd: Reader) ReadStore (OUT a: Store), NEW; 
      ... 
    END; 

    Writer = LIMITED RECORD 
      ... 
      (VAR wr: Writer) WriteStore (a: Store), NEW; 
      ... 
    END; 

END Stores.
Объект типа Store это любой объект типа Canonical.Object, который заявил о себе, что он умеет обрабатывать сообщения Externalize и Internalize. Так, например, следующий тип My.Object считается совместимым с типом Stores.Store:
Код:
DEFINITION My; 

  IMPORT Canonical, Stores; 

  TYPE 
    Object = POINTER TO RECORD (Canonical.Object) {Stores.Externalize, Stores.Internalize}
      ... 
    END; 

END My.
Ответить с цитированием
  (#3 (permalink)) Старый
Trurl Trurl вне форума
Member
 
Сообщений: 108
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.08.2004
По умолчанию 03.11.2005, 15:44

Пример на Lagoona
Код:
MODULE Stores;

  MESSAGE
    Internalize(VAR rd: Reader);
    Externalize(VAR wr: Writer);

  CATEGORY 
    Storable* = (Internalize, Externalize);

  TYPE 
     Reader* = RECORD 
       ... 
     END; 

     Writer* = RECORD 
       ... 
     END; 

   PROCEDURE WriteInt* (VAR wr: Writer; x: INTEGER)
   ... 
   PROCEDURE WriteStorable* (VAR wr: Writer; x: Storable)
   BEGIN
     Externalize(wr) -> x;
   END Internalize;

END Stores.

MODULE MyStores;
  IMPORT Stores;

  TYPE 
      Store = OBJECT Stores.Storable 
              BASED ON StoreDesc;
      StoreDesc = RECORD 
        x,y:INTEGER; 
      END; 

      List  = OBJECT Stores.Storable 
              BASED ON StoreDesc;
      ListDesc = RECORD 
         head:Stores.Storable; 
         tail:List; 
      END; 

   METHOD Externalize(VAR rd: Stores.Reader) -> st:Store;
   BEGIN
     Stores.WriteInt(rd,st.x);
     Stores.WriteInt(rd,st.y)
   END Internalize;
   ...
   METHOD Externalize(VAR rd: Stores.Reader) -> lst:List;
   BEGIN
     Stores.WriteStorable(rd,lst.head);
     IF lst.tail<> NIL THEN
       RESEND TO lst.tail
     END;
   END Internalize;
END MyStores.
Ответить с цитированием
  (#4 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию 03.11.2005, 16:37

Цитата:
Originally posted by Trurl
[b]Пример на Lagoona
Спасибо. Не знал. Михаэль Франц значит в 1997 году это опубликовал...

1) Как я понял, соответствие между MESSAGE MyStores.Externalize осуществляется компилятором на основании совпадения имен и сигнатур? То есть компилятор способен потребовать от программиста реализовать все обработчики сообщений заявленных к обработке. Это хорошо. Повышает надёжность.

2) Исходя из текста:
Код:
  CATEGORY 
    Storable* = (Internalize, Externalize); 

  TYPE 
     Reader* = RECORD 
       ... 
     END;
можно заключить, что CATEGORY - это не TYPE. Но в то же самое время, глядя на текст
Код:
      ListDesc = RECORD 
         head:Stores.Storable; 
         tail:List; 
      END;
можно заключить, что Stores.Storable - это всё-таки тип. Небольшая шероховатость... как-нибудь так было бы более гладко:
Код:
      ListDesc = RECORD 
         head: OBJECT{Stores.Storable};
         tail: List
      END;
или объявить, что Storable - это тип:
Код:
  TYPE
    Storable = OBJECT{Internalize, Externalize};
3) Таким "кверху ногами замороченным" текстом нас не возьмёшь ;-)
Код:
   METHOD Externalize(VAR rd: Stores.Reader) -> lst:List; 
   BEGIN 
     Stores.WriteStorable(rd,lst.head); 
     IF lst.tail<> NIL THEN 
       RESEND TO lst.tail 
     END; 
   END Externalize;
ибо очевидно, что это тоже самое что и:
Код:
   PROCEDURE (lst: List) Externalize (VAR rd: Stores.Reader);
   BEGIN 
     Stores.WriteStorable(rd, lst.head);
     IF lst.tail # NIL THEN 
       lst.tail.Externalize(rd)
     END
   END Externalize;

Еще раз спасибо за материал для размышлений...
Ответить с цитированием
  (#5 (permalink)) Старый
Trurl Trurl вне форума
Member
 
Сообщений: 108
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.08.2004
По умолчанию 03.11.2005, 17:35

Цитата:
Originally posted by S.Yu.Gubanov
[b]1) То есть компилятор способен потребовать от программиста реализовать все обработчики сообщений заявленных к обработке. Это хорошо. Повышает надёжность.
Но программист может это обойти, задав обработчик по умолчанию.
Код:
   METHOD DEFAULT -> lst:List; 
   BEGIN 
   END DEFAULT;
2) Категории - не типы, но переменные могут быть не типизированными, а "категоризированными".
Ответить с цитированием
Ads.
Ads
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
альтернатива win 7! Андрей Д Вопросы начинающих программистов 10 16.09.2011 20:53
Сбор сообщений службы сообщений Windows XP testor48 Сетевое программирование 0 28.03.2011 09:43
Сбор сообщений службы сообщений Windows XP testor48 Delphi 0 26.03.2011 09:11
Interface в cС++ builder как с ними работать sasha35 C++ Builder 1 27.07.2010 01:09
Альтернатива Cerber86 Подбор комплектующих 10 21.09.2008 09:53
Программист С/C++(Graphic User Interface) 2500$ youth Работа 0 18.12.2007 14:04
Interface not supported как исправить nepser Delphi 2 04.05.2007 15:08
Transport Data Interface где найти информацию k00mber Сетевое программирование 0 01.03.2005 16:25
Oracle Call Interface где найти литературу vilru Oracle 2 22.12.2004 19:19
Click&Buy Merchant Interface (WebMoney.ru) slcut PHP 1 25.07.2004 15:40
LCD Backlight Control Interface где найти деклорацию soska Железо. Написание драйверов 0 06.05.2004 17:59



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