(*~\Глагол\Отделы\Иное~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                             ОТДЕЛ Фигуры;
(*============================================================================*)
(* НАЗНАЧЕНИЕ: опорные виды для геометрических Фигур и доступа к ним
//             при Предметно-описательном Подходе (ПоП) на Глаголе
      Шаблон-1\Pattern-1.
  Динамическая рассылка осуществляется путём переопределения
    абстрактных методов-задач\процедур
  из отдела\модуля Фигуры.отд в реальные методы расширенной записи (у потомка). *)
(*============================================================================*)

ВИД
     (*- Абстрактный ВИД: Фигуры.нФигура      -          абстрактный  набор  Фигуры.нФигура    и
                          Фигуры.ДкФигуре     - ДОСТУП К абстрактному набору Фигуры.нФигура
         Абстрактный ВИД: Фигуры.нИнтерфейс   -          абстрактный  набор  Фигуры.нИнтерфейс и
                     ВИД  Фигуры.ДкИнтерфейсу - ДОСТУП К абстрактному набору Фигуры.нИнтерфейс
      -*)
  ДкФигуре-     = ДОСТУП К нФигура;          (* доступ к абстрактному набору Фигуры.нФигура    *)
  ДкИнтерфейсу- = ДОСТУП К нИнтерфейс;       (* доступ к абстрактному набору Фигуры.нИнтерфейс *)

                           нФигура- =
  НАБОР                            (*  свойство - доступ к интерфейсу Фигуры) *)
    ифД+:ДкИнтерфейсу;
  КОН;                          (* предок (опора) любого ВИДа Фигура.нФигура  *)

                        нИнтерфейс- =
  НАБОР                                (* изменяемых/полиморфных методов-задач*)
    нарисовать+:ЗАДАЧА(фД+:ДкФигуре);
(*  нарисовать - поле-ЗАДАЧА, но   вызов:
 иД.нарисовать(фД);
                                             возможен только после присвоения:
 иД.нарисовать:=Рисуем;         (* инициализация поля-метода
        задачей Рисуем()     у доступа к интерфейсу фигуры "иД" ВИДа ДкИнтерфейсу *)
 *)
      очистить+:ЗАДАЧА(фД+:ДкФигуре);
(*    очистить - поле-ЗАДАЧА, но   вызов:
   иД.очистить(фД);
                                             возможен только после присвоения:
   иД.очистить:=Очищаем;        (* инициализация поля-метода
        задачей Очищаем()    у доступа к интерфейсу фигуры "иД" ВИДа ДкИнтерфейсу *)
 *)
   переместить+:ЗАДАЧА(фД+:ДкФигуре;
(* переместить - поле-ЗАДАЧА, но   вызов:
иД.переместить(фД);
                                             возможен только после присвоения:
иД.переместить:=Перемещаем;     (* инициализация поля-метода
        задачей Перемещаем() у доступа к интерфейсу фигуры "иД" ВИДа ДкИнтерфейсу *)
 *)
                       dx,dy:ЦЕЛ
                      );
  КОН;                        (* предок (опора) любого ВИДа Фигура.нИнтерфейс *)

(*-------------------- Абстрактные методы для НАБОРа "нФигура" ---------------*)
  ЗАДАЧА                                                           (*(нФигура)*)
         Инит-(фД+:ДкФигуре;интерфейсД+:ДкИнтерфейсу);
  УКАЗ
               фД.ифД:=интерфейсД;
                        (*  свойство\поле данных - доступ к интерфейсу Фигуры *)
  КОН Инит;

(*-------------------- Абстрактные методы для НАБОРа "нИнтерфейс" ------------*)
  ЗАДАЧА                                                        (*(нИнтерфейс)*)
         Рисуем-(фД+:ДкФигуре);
  УКАЗ
                 фД.ифД.нарисовать(фД)
                                (* вызов свойства\поля-задачи -  нарисовать() *)
  КОН Рисуем;
  ЗАДАЧА                                                        (*(нИнтерфейс)*)
         Очищаем-(фД+:ДкФигуре);
  УКАЗ
                  фД.ифД.очистить(фД)
                                (* вызов свойства\поля-задачи -    очистить() *)
  КОН Очищаем;
  ЗАДАЧА                                                        (*(нИнтерфейс)*)
         Перемещаем-(фД+:ДкФигуре; dx,dy:ЦЕЛ);
  УКАЗ
    фД.ифД.переместить(фД,dx,dy)
                                (* вызов свойства\поля-задачи - переместить() *)
  КОН Перемещаем;

КОН Фигуры.

(* -->

  Доступ- = ДОСТУП К Вид;  (* предок (опора) доступа к любому ВИДу Фигура.Вид *)
                     Вид- =
  НАБОР
  КОН;                     (* предок (опора)           любого ВИДа Фигура.Вид *)


      (*- НЕ абстрактные образцы ВИДов: Набор.нЗвено  - (односвязное)
                                        Набор.нСписок - звеньев с головой и хвостом
                                 вид    Набор.ДкЗвену - ДОСТУП К 'нЗвено' -*)

   (*= описание экспортируемого/общедоступного/
                               публичного/видимого НАБОРа-класса - нЗвено =*)
  ДкЗвену- = ДОСТУП К нЗвено;
                      нЗвено- =
  НАБОР                                   (* односвязное звено цепного списка *)
    телоД+ :Доступ;   (* свойство набора Звено (Доступ к набору - телу звена) *)
    слеД+  :ДкЗвену   (* свойство набора Звено (Доступ к следующему    звену) *)
  КОН;

        (* Двуконцевой цепной 'Список' (очередь) из односвязных звеньев
с добавлением нового звена в конец-хвост <конЗвеноД+> и
                              со ссылкой <начЗвеноД+> на голову - 1-е звено и
                              со ссылкой <телоД+> на набор разнотипных полей  *)
  ДкСписку- = ДОСТУП К нСписок;
                       нСписок- =
  НАБОР
    цВсегоЗвеньев+:ЦЕЛ;
    начЗвеноД+:ДкЗвену;               (* ссылка на голову списка *)
    конЗвеноД+:ДкЗвену                (* ссылка на  хвост списка *)
  КОН;

         (*- Примеры задач для работы с образцовым набором вида 'Список'
                                                          из звеньев-наборов 
                или  задачи-методы  для набора <список+>
          -*)
(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА                                                            (Фигура.Вид)
       ОчиститьСписок-(цепнойСписок+:Набор.нСписок);
УКАЗ
                       цепнойСписок.цВсегоЗвеньев:=0;
                       цепнойСписок.начЗвеноД:=ПУСТО;
                       цепнойСписок.конЗвеноД:=ПУСТО
КОН ОчиститьСписок;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА                                                         (Набор.нСписок)
       ВКонецСписка-(цепнойСписок+:Набор.нСписок;
                          данныеД :Набор.Доступ);
(*
 * Цель: создать и присоединить новое звеноД в конец <цепнойСписок+>,
 *          а в его поле со ссылкой на телоД+ заслать <данныеД>
 *)
ПЕР
          звеноД:ДкЗвену;
УКАЗ
  СОЗДАТЬ(звеноД);
          звеноД.телоД:=данныеД;
  ЕСЛИ
                     цепнойСписок.начЗвеноД = ПУСТО
  ТО
                     цепнойСписок.начЗвеноД:=звеноД;
                     цепнойСписок.конЗвеноД:=звеноД
  ИНАЧЕ          (* не 1-е звено *)
    (*               цепнойСписок.начЗвеноД:=звеноД; - голову очереди не изменяем
     при добавлении не 1-го звена, а только
          при удалении 1-го и единственного *)
                     цепнойСписок.конЗвеноД.слеД:=звеноД;
                     цепнойСписок.конЗвеноД     :=звеноД
  КОН;
  УВЕЛИЧИТЬ(         цепнойСписок.цВсегоЗвеньев)
КОН ВКонецСписка;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА (Набор.нСписок) Дк1муЗвену-(цепнойСписок-:Набор.нСписок):ДкЗвену;
(*
   Цель: получить доступ к первому звену <цепнойСписок+> (без удаления звена)
 *)
УКАЗ
            ВОЗВРАТ                цепнойСписок.начЗвеноД
КОН Дк1муЗвену;

<-- *)
