OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 23:58

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




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
СообщениеДобавлено: Четверг, 18 Ноябрь, 2010 16:23 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
При разборе пакета SQL наконец внятно понял, зачем нужны абстрактные типы и Meta :)

Родился один пример, чтобы проверить, как такое безобразие уживается в dll. Подумал, что это может оказаться полезным тем, кто хочет разобраться с использованием абстрактных типов.

Вначале мы абстрактно описываем некоторый процесс, например есть объект содержащий вектор, есть функция вычисления длины. Вот и все. А реализовать это можно разными способами и реализации легко менять в BB. Объект не зря называется Driver, поскольку такой подход удобен в случае, например, общения с базой данных.
Код:
MODULE MyDriver;
   IMPORT Meta;
   TYPE
      Driver* = POINTER TO ABSTRACT RECORD
         x*, y*: REAL;
      END;
      Realisation = PROCEDURE (OUT d: Driver);

   PROCEDURE (d: Driver) Len* (): REAL, NEW, ABSTRACT;
   PROCEDURE (d: Driver) Values* (x, y: REAL), NEW, ABSTRACT;
   
   PROCEDURE Load* (realisation: ARRAY OF CHAR; OUT d: Driver; OUT res: INTEGER);
      VAR item: Meta.Item; mod: Meta.Name; ok, a: BOOLEAN; t: INTEGER;
         v: RECORD (Meta.Value)
            Load: Realisation
         END;
   BEGIN
      mod := realisation$;
      Meta.Lookup(mod, item); d := NIL; res := 0;
      IF item.obj = Meta.modObj THEN
         item.Lookup("Load", item);
         IF item.obj = Meta.procObj THEN
            item.GetVal(v, ok);
            IF ok THEN
               v.Load(d);
               res := 0
            ELSE
               res := 3
            END
         ELSE
            res := 2
         END
      ELSE
         res := 1
      END
   END Load;

END MyDriver.


Затем описываем первую реализацию драйвера.
Код:
MODULE MyRealisation;
   IMPORT Math, MyDriver;
   TYPE
      Driver = POINTER TO RECORD (MyDriver.Driver) END;

   PROCEDURE (d: Driver) Len* (): REAL;
   BEGIN
      RETURN Math.Sqrt(Math.IntPower(d.x, 2) + Math.IntPower(d.y, 2))
   END Len;

   PROCEDURE (d: Driver) Values* (x, y: REAL);
   BEGIN
      d.x := x;
      d.y := y;
   END Values;
   
   PROCEDURE Load* (OUT d: MyDriver.Driver);
      VAR i: INTEGER; h: Driver;
   BEGIN
      NEW(h); d := h;
   END Load;

END MyRealisation.


И вторую реализацию.
Код:
MODULE MyRealisation2;

   IMPORT Math, MyDriver;

   TYPE
      Driver = POINTER TO RECORD (MyDriver.Driver) END;

   PROCEDURE (d: Driver) Len* (): REAL;
   BEGIN
      RETURN Math.Sqrt(d.x*d.x + d.y*d.y)
   END Len;
   
   PROCEDURE (d: Driver) Values* (x, y :REAL);
   BEGIN
      d.x := x;
      d.y := y;
   END Values;

   PROCEDURE Load*(OUT d: MyDriver.Driver);
      VAR i: INTEGER; h: Driver;
   BEGIN
      NEW(h); d := h;
   END Load;

END MyRealisation2.


Ну и наконец — использование.
Код:
MODULE MyUsage;

   IMPORT MyDriver, Out:=StdLog;

   PROCEDURE Test*();
      VAR d1, d2: MyDriver.Driver; res1, res2: INTEGER;
   BEGIN
      MyDriver.Load("MyRealisation", d1, res1);
      MyDriver.Load("MyRealisation2", d2, res2);
      IF (res1 = 0) & (res2 = 0) THEN
         d1.Values(12, 10);
         d2.Values(12, 10);
         Out.Real(d1.Len() + d2.Len())
      ELSE
         Out.String("Error")
      END
   END test;

END MyUsage.


Я все это делал, чтобы проверить, как такая функция будет работать в dll и что указывать при компиляции библиотеки, получается надо просто указывать обе реализации. Вроде работает.

Если вместо Out сделать RETURN.
^Q DevLinker.LinkDll
test.dll := Kernel+ Math Meta MyDriver MyRealisation MyRealisation2 MyUsage # ~


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

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


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

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


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

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