OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 22 Ноябрь, 2017 10:07

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




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Интерфейсы в CP
СообщениеДобавлено: Пятница, 23 Май, 2014 13:57 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1427
Навеяно это темой: viewtopic.php?f=127&t=4940

Как вам такое извращение?
Код:
MODULE TestInterface;
IMPORT Log := StdLog;
TYPE
    Object* = POINTER TO ABSTRACT RECORD END; (*  предок всех объектов *)
    Interface* = ABSTRACT RECORD END; (*  предок всех интерфейсов *)
   
   
    Printable* = RECORD (Interface) (*  объявили некий интерфейс *)
        print: PROCEDURE (this: Object);
    END;
   
    T0 = POINTER TO RECORD (Object) (* объявили некий объект *)
        name: ARRAY 256 OF CHAR;
    END;
   
   
PROCEDURE (this: Object) With* (VAR msg: Interface): BOOLEAN, NEW, ABSTRACT;  (* метод, проверяющий наличие интерфейса и выполняющий инициализацию оного для конкретного объекта *)

PROCEDURE Print* (this: Object); (* реализация метода интерфейса для конкретного объекта *)
BEGIN
    WITH this: T0 DO
        Log.String(this.name);
    END;
END Print;

PROCEDURE (this: T0) With* (VAR iface: Interface): BOOLEAN; (* поддержка интерфейсов в конкретном объекте  *)
BEGIN
    WITH iface: Printable DO
        iface.print := Print;
        RETURN TRUE;
    ELSE
        RETURN FALSE;   
    END;
END With;

PROCEDURE Do*;
VAR
    x: T0;
    printable: Printable;
BEGIN
    NEW(x);
    x.name := "T0";
    IF x.With(printable) THEN (*  если объект поддерживает интерфейс то вызываем метод интерфейса *)
        printable.print(x);
    END;
END Do;

END TestInterface.Do


Все это, конечно, надо в три разных модуля раскидать, но мне было лень :)

ps Сделать можно как полностью на методах, так и полностью на процедурных типах :wink:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Интерфейсы в CP
СообщениеДобавлено: Пятница, 23 Май, 2014 15:43 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 8867
Откуда: Россия, Орёл
В принципе, один из вариантов. ))

Если иметь базовый HandleMsg в проекте у всех объектов, то можно через него и запрашивать интерфейс, в принципе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Интерфейсы в CP
СообщениеДобавлено: Пятница, 23 Май, 2014 15:48 

Зарегистрирован: Вторник, 30 Июнь, 2009 14:58
Сообщения: 1427
Угу :)

Мне больше всего нравится, что это даже в Oberon-07 можно сделать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Интерфейсы в CP
СообщениеДобавлено: Суббота, 24 Май, 2014 11:30 
Модератор
Аватара пользователя

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

В большинстве случаев, конечно, сущности проекта "многогранны", но достаточно обычного паттерна Twin - когда я перехожу от грани к грани через статически известные методы (a.B() и b.A()).
Т.е. не возникает задачи запроса какого угодно интерфейса у произвольного объекта.

Встречается задача запроса КОНКРЕТНОГО интерфейса у ПРОИЗВОЛЬНОГО объекта системы (допустим, мы хотим поддержку сериализации без расширения от единого типа Stores.Store. Тогда мы просим каждый объект дать нам свой интерфейс сериализации, когда он нам нужен).
Тут катит HanвleMsg(msg), где msg: GetBMsg = RECORD b: B END (конечно, мы должны позаботиться о закладывании для проекта базового типа с HandleMsg).

В общем же случае - способ запроса ЛЮБОГО интерфейса у ЛЮБОГО объекта. Какие тут случаи из реальной жизни можно привести?


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

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


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

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


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

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