OberonCore
https://forum.oberoncore.ru/

Интерфейсы в CP
https://forum.oberoncore.ru/viewtopic.php?f=127&t=5133
Страница 1 из 1

Автор:  ilovb [ Пятница, 23 Май, 2014 13:57 ]
Заголовок сообщения:  Интерфейсы в CP

Навеяно это темой: 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:

Автор:  Илья Ермаков [ Пятница, 23 Май, 2014 15:43 ]
Заголовок сообщения:  Re: Интерфейсы в CP

В принципе, один из вариантов. ))

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

Автор:  ilovb [ Пятница, 23 Май, 2014 15:48 ]
Заголовок сообщения:  Re: Интерфейсы в CP

Угу :)

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

Автор:  Илья Ермаков [ Суббота, 24 Май, 2014 11:30 ]
Заголовок сообщения:  Re: Интерфейсы в CP

На самом деле, оно нечасто нужно - и хорошо бы собрать коллекцию use-cases именно из КП-шных проектов (когда человек не использует мульти-интерфейсность только потому, что "оно же есть").

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

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

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/