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

ИСПОЛЬЗУЕТ 
  НаЭкран ИЗ "..\..\Отделы\Обмен\ВводВывод\",

  Агенты  ИЗ "..\..\Отделы\ПоП\";

ВИД
        ДкПредмету = ДОСТУП К нПредмет;
                              нПредмет = НАБОР(Агенты.нФигура) (* описание предмета = дискриптор [ПредметDisc] *)

                _цел:ЦЕЛ;                            (* свойство/атрибут вида Класса\предмета (поле данных) *)
                Сохр:ЗАДАЧА(п+:нПредмет; ц:ЦЕЛ);     (* свойство              Класса\предмета (поле-задача) *)

                x,y,w,h:ЦЕЛ                          (* свойства/атрибуты            предмета (поля данных) *)
(*.реализации. 
              Метод1:ЗАДАЧА(п+:нПредмет; ц:ЦЕЛ);
              Метод2:ЗАДАЧА(п+:нПредмет; ц:ЦЕЛ);
*)
                                         КОН;   (* нПредмет *)

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА                                          (*(нПредмет)*)
       Метод1(п+:нПредмет; ц:ЦЕЛ);
         (* 1-я реализация свойства Сохр(п,ц) набора Предмет *)
УКАЗ
                   п._цел:=ц;     

  НаЭкран.Цел4числа("^ Значение атрибута предмета  у Метод1() свойства п.Сохр(п,ц); п._цел = %2d ",
                                                                                    п._цел,0,0,0);
КОН Метод1;
(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА                                          (*(нПредмет)*)
       Метод2(п+:нПредмет; ц:ЦЕЛ);
         (* 2-я реализация свойства Сохр(п,ц) набора Предмет *)
УКАЗ
                   п._цел:=ц*ц;     

  НаЭкран.Цел4числа("^ Значение атрибута предмета  у Метод2() свойства п.Сохр(п,ц); п._цел = %2d ",
                                                                                    п._цел,0,0,0);
КОН Метод2;
(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА                                          (*(нПредмет)*)
       Задача1(пД+:ДкПредмету; ц:ЦЕЛ);
                 (* ЗАДАЧА (Предмет) - это только декорация *)
УКАЗ
                      пД._цел:=ц;     

  НаЭкран.Цел4числа("^ Значение атрибута предмета в Задача1() для экземпляра:      пД._цел = %2d ^^",
                                                                                   пД._цел,0,0,0);
КОН Задача1;

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

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Главная;
ПЕР
   аД:Агенты.ДкФигуре;         (* доступ к Агенту *)
   уД:Агенты.ДкПульту;         (* доступ к пульту управления Агентом *)

  экземплярД:ДкПредмету;
  экземпляр :нПредмет;
                               (*-+++++++++++++++++++++++++++++++++++++++++++-*)
УКАЗ
(*- Проверка работы НАБОРа-класса нПредмет -*)

  НаЭкран.ВсяЦепь("^ Проверка Предметно-Описательного Подхода (ПоП - аналог ООП) с предметами^ (т.е. экземплярами) вида нПредмет в рус.ЯП Глагол.^");
  НаЭкран.ВсяЦепь("^ ООП - это подход с акцентом на классы (class-centered),");
  НаЭкран.ВсяЦепь("^ ПоП - это подход с акцентом на экземпляры вида нПредмет (instance-centred),^ при котором одно и тоже 'свойство предмета' может иметь разные реализации у одного^ экземпляра предмета или отличаться у разных экземпляров одного предмета.^");

(* --- Работа с доступом к экземпляру предмета --- *)

                              (* Конструктор предмета  аД:Агенты.ДкФигуре     *)
  СОЗДАТЬ(аД);            (* Выделить память предмету  аД:Агенты.ДкФигуре     *)
 ОБНУЛИТЬ(аД^);           (* Обнуление полей предмета  аД:Агенты.ДкФигуре     *)

                              (* Конструктор предмета  уД:Агенты.ДкПульту *)
  СОЗДАТЬ(уД);            (* Выделить память предмету  уД:Агенты.ДкПульту *)
 ОБНУЛИТЬ(уД^);           (* Обнуление полей предмета  уД:Агенты.ДкПульту *)

  Агенты.Инит(аД,уД); (* Инициализация поля  аД.пультУправД у Агенты.прямоугольник аД *)
(*
                   (* обнуление переменных вида ДОСТУП можно сделать при запуске ПГ.exe *)
  уД._цел:=21;
*)
         (* Инициализация задачных полей реальными методами с заглавной буквы *)
  уД.нарисовать := Рисуем;
  уД.очистить   := Очищаем;
  уД.переместить:= Перемещаем;
(*
  уД.mark  := Mark;
 *)


(* --- Работа с экземпляром предмета --- *)

  экземпляр._цел:=11;

  НаЭкран.Цел4числа("^ Значение атрибута предмета у экземпляр._цел = %2d ^",
                                                    экземпляр._цел,0,0,0);
(*
  экземпляр.Сохр(экземпляр,10); - такой вызов (ещё не инициализированного) свойства приводит к зависанию приложения
  экземпляр.Метод1(экземпляр,11); - свойство не определено в наборе (действительно, определено только свойство Сохр(п,ц))

            Метод1(экземпляр,11); - допустимый вызов задачи Метод1(), пока не связанной с набором Предмет
*)
  экземпляр.Сохр:=Метод1;           (* инициализация свойства предмета задачей Метод1() у <экземпляр> *)
  экземпляр.Сохр(экземпляр,11);

  экземпляр.Сохр:=Метод2;           (* инициализация свойства предмета задачей Метод2() у <экземпляр> *)
  экземпляр.Сохр(экземпляр,12);

(* --- Работа с доступом к экземпляру предмета --- *)

  СОЗДАТЬ(экземплярД); ОБНУЛИТЬ(экземплярД^);
                   (* обнуление переменных вида ДОСТУП можно сделать при запуске ПГ.exe *)
  экземплярД._цел:=21;

  НаЭкран.Цел4числа("^^ Значение атрибута предмета у экземплярД._цел = %2d ^",
                                              экземплярД._цел,0,0,0);
(*
  экземплярД.Сохр(экземплярД^,30); - значение доступа "ПУСТО" для ещё не инициализированного свойства у <экземплярД>
  экземплярД.Метод2(экземпляр,11); - свойство не определено в наборе (действительно, определено только свойство Сохр(п,ц))

             Метод2(экземпляр,12); - допустимый вызов задачи Метод2(), пока не связанной с набором Предмет
*)
  экземплярД.Сохр:=Метод1;          (* инициализация свойства предмета задачей Метод1() у <экземплярД> *)
  экземплярД.Сохр(экземплярД^,21);

  экземплярД.Сохр:=Метод2;          (* инициализация свойства предмета задачей Метод2() у <экземплярД> *)
  экземплярД.Сохр(экземплярД^,22);

           Задача1(экземплярД,23);  (* допустимый вызов задачи не связанной с набором Предмет *)
(*
  экземплярД.Задача1(экземплярД,23); - свойство не определено в наборе
*)
КОН Главная;

(*+ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss+*)
УКАЗ
  Главная
КОН Пример4_ПоП.
