(*~\Глагол\ПриложенияТесты\Наборы\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                        ОТДЕЛ Расширения+;
(*============================================================================*
 * НАЗНАЧЕНИЕ: 
 *   проверка расширений (наследований) в наборах на Глаголе
 *             и видимость свойств (т.е. полей данных).
 *   Переделка Исп.отд
 *----------------------------------------------------------------------------*
 * NB! Здесь демонстрируется Предметно-Описательный Подход (традиционно - ООП),
 *     когда в одном отделе определяются 3 набора и в методе N1 1-го набора
 *
 *                                           ЗАДАЧА (Набор1) N1(наб+:Набор1);
 *
 *     используются сразу все три набора: 1-й и его потомки - 2-й и 3-й,
 *     т.е. методы опорного набора и его помков могут переплетаться,
 *     когда они собраны в одном отделе.
 *     Это ООП по Никласу Вирту!
 *============================================================================*)

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

ВИД
  Набор1=НАБОР    (* Опорный набор в иерархии из 3-х наборов и не абстрактный *)
           п1:ЦЕЛ
         КОН;

  Набор2=НАБОР(Набор1)(* 2-й набор в иерархии из 3-х наборов - не абстрактный *)
        (* п1:ЦЕЛ; *)
           п2:ЦЕЛ
         КОН;

  Набор3=НАБОР(Набор2)(* 3-й набор в иерархии из 3-х наборов - не абстрактный *)
        (* п1:ЦЕЛ; *)
        (* п2:ЦЕЛ; *)
           п3:ЦЕЛ
         КОН;

(*~~~~~~~~ задача-Метод наб1_Метод1 для 1-го набора и его потомков ~~~~~~~~~~~*)
ЗАДАЧА              (* (Набор1) *)
       наб1_Метод1(наб+:Набор1);    (* наб ЯВЛЯЕТСЯ Набор1,2,3 и ДЛЯ наб ВИДА *)
ПЕР
  п:ЦЕЛ;
УКАЗ
  НаЭкран.ВсяЦепь("^. проверка в задаче наб1_Метод1(н3); инструкции: наб ЯВЛЯЕТСЯ Набор1,2,3 ...^");

  ЕСЛИ наб ЯВЛЯЕТСЯ Набор1 ТО
                             п:=наб.п1;
    НаЭкран.Цел4числа("^п:=наб.п1 = %d ",п,0,0,0);
    НаЭкран.ВсяЦепь("приёмник наб - вида Набор1^")
  КОН;
  ЕСЛИ наб ЯВЛЯЕТСЯ Набор2 ТО
                             п:=2;
    НаЭкран.Цел4числа("^п:=2 = %d ",п,0,0,0);
    НаЭкран.ВсяЦепь("приёмник наб - также вида Набор2, но свойство наб.п2 при наб1_Метод1(н3); недоступно^")
  КОН;
  ЕСЛИ наб ЯВЛЯЕТСЯ Набор3 ТО
                             п:=3;
    НаЭкран.Цел4числа("^п:=3 = %d ",п,0,0,0);
    НаЭкран.ВсяЦепь("приёмник наб - также вида Набор3, но свойство наб.п3 при наб1_Метод1(н3); недоступно^")
  КОН;

  НаЭкран.ВсяЦепь("^. проверка в задаче наб1_Метод1(н3); инструкции: ДЛЯ наб ВИДА Набор1,2,3 ...^");

  ДЛЯ наб ВИДА
  | Набор1:
                             п:=наб.п1;
    НаЭкран.Цел4числа("^п:=наб.п1 = %d ",п,0,0,0);
    НаЭкран.ВсяЦепь("приёмник наб - вида Набор1^")

  | Набор2:
                             п:=наб.п2;
    НаЭкран.Цел4числа("^п:=наб.п2 = %d ",п,0,0,0);
    НаЭкран.ВсяЦепь("приёмник наб - вида Набор2^")

  | Набор3:
                             п:=наб.п3;
    НаЭкран.Цел4числа("^п:=наб.п3 = %d ",п,0,0,0);
    НаЭкран.ВсяЦепь("приёмник наб - вида Набор3^")

  ИНАЧЕ
                             п:=333;
    НаЭкран.Цел4числа("^п:=333 = %d ошибка^^",п,0,0,0);
                                      (* ошибка *)
  КОН;
КОН наб1_Метод1;

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

  НаЭкран.ВсяЦепь("^. проверка в задаче наб2_Метод1(н3); инструкции: ДЛЯ наб ВИДА Набор2,3 ...^");

  ДЛЯ наб ВИДА
(*
  | Набор1:
 (* Набор1 - не является расширением набора <наб>, а является его опорой *)

                             п:=наб.п1;
    НаЭкран.Цел4числа("^п:=наб.п1 = %d ",п,0,0,0);
    НаЭкран.ВсяЦепь("приёмник наб - вида Набор1^")
*)
  | Набор2:
                        п:=наб.п2;
    НаЭкран.Цел4числа("^п:=наб.п2 = %d ",п,0,0,0);
    НаЭкран.ВсяЦепь("приёмник наб - вида Набор2^")

  | Набор3:
                        п:=наб.п3;
    НаЭкран.Цел4числа("^п:=наб.п3 = %d ",п,0,0,0);
    НаЭкран.ВсяЦепь("приёмник наб - вида Набор3^")

  ИНАЧЕ
                        п:=333;
    НаЭкран.Цел4числа("^п:=333 = %d ошибка^^",п,0,0,0);
                                 (* ошибка *)
  КОН;
КОН наб2_Метод1;

(*~~~~~~~~ задача-Метод наб3_Метод1 только для 3-го набора ~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА              (* (Набор3) *)
       наб3_Метод1(наб+:Набор3);    (* наб ЯВЛЯЕТСЯ Набор1,2,3 и ДЛЯ наб ВИДА *)
ПЕР
  п:ЦЕЛ;
УКАЗ
  НаЭкран.ВсяЦепь("^. проверка в задаче наб3_Метод1(н3); инструкции: наб ЯВЛЯЕТСЯ Набор3 ...^");
(*
  ЕСЛИ наб ЯВЛЯЕТСЯ Набор1 ТО (* Набор1 - не является расширением набора <наб>, а является его опорой *)
                             п:=наб.п1;
    НаЭкран.Цел4числа("^п:=наб.п1 = %d ",п,0,0,0);
    НаЭкран.ВсяЦепь("приёмник наб - вида Набор1^")
  КОН;
  ЕСЛИ наб ЯВЛЯЕТСЯ Набор2 ТО (* Набор2 - не является расширением набора <наб>, а является его предыдущей опорой *)
                             п:=наб.п2;
    НаЭкран.Цел4числа("^п:=наб.п2 = %d ",п,0,0,0);
    НаЭкран.ВсяЦепь("приёмник наб - вида Набор2^")
  КОН;
*)
  ЕСЛИ наб ЯВЛЯЕТСЯ Набор3
  ТО
                        п:=наб.п3;
    НаЭкран.Цел4числа("^п:=наб.п3 = %d ",п,0,0,0);
    НаЭкран.ВсяЦепь("приёмник наб - вида Набор3^")
  КОН;

  НаЭкран.ВсяЦепь("^. проверка в задаче наб3_Метод1(н3); инструкции: ДЛЯ наб ВИДА Набор3 ...^");

  ДЛЯ наб ВИДА
(*
  | Набор1:
 (* Набор1 - не является расширением набора <наб>, а является его опорой *)

                             п:=наб.п1;
    НаЭкран.Цел4числа("^п:=наб.п1 = %d ",п,0,0,0);
    НаЭкран.ВсяЦепь("приёмник наб - вида Набор1^")

  | Набор2:
 (* Набор2 - не является расширением набора <наб>, а является его предыдущей опорой *)

                             п:=наб.п2;
    НаЭкран.Цел4числа("^п:=наб.п2 = %d ",п,0,0,0);
    НаЭкран.ВсяЦепь("приёмник наб - вида Набор2^")
*)
  | Набор3:
                        п:=наб.п3;
    НаЭкран.Цел4числа("^п:=наб.п3 = %d ",п,0,0,0);
    НаЭкран.ВсяЦепь("приёмник наб - вида Набор3^")

  ИНАЧЕ
                        п:=333;
    НаЭкран.Цел4числа("^п:=333 = %d ошибка^^",п,0,0,0);
                                 (* ошибка *)
  КОН;
КОН наб3_Метод1;

(*~~~~~~~~ задача-Метод наб1_Метод2 для 1-го набора и его потомков ~~~~~~~~~~~*)
ЗАДАЧА              (* (Набор1) *)
       наб1_Метод2(наб+:Набор1);                  (* ДЛЯ наб ВИДА  Набор1,2,3 *)
ПЕР
  п:ЦЕЛ;
УКАЗ
  ДЛЯ наб ВИДА
  | Набор1: 
                             п:=наб.п1;
             наб1_Метод1(наб)
  | Набор2: 
                             п:=наб.п2;
             наб2_Метод1(наб)
  | Набор3:
                             п:=наб.п3;
             наб3_Метод1(наб)
  ИНАЧЕ
                             п:=333;
    НаЭкран.Цел4числа("^п:=333 = %d ошибка^^",п,0,0,0);
                                      (* ошибка *)
  КОН;
КОН наб1_Метод2;

(*~~~~~~~~ задача-Метод наб2_Метод2 для 2-го набора и его потомка ~~~~~~~~~~~~*)
ЗАДАЧА              (* (Набор2) *)
       наб2_Метод2(наб+:Набор2);                    (* ДЛЯ наб ВИДА  Набор2,3 *)
ПЕР
  п:ЦЕЛ;
УКАЗ
  ДЛЯ наб ВИДА
(*
  | Набор1: 
 (* Набор1 - не является расширением набора <наб>, а является его опорой *)
                             п:=наб.п1;
            наб1_Метод1(наб)
*)
  | Набор2: 
                             п:=наб.п2;
            наб2_Метод1(наб)
  | Набор3:
                             п:=наб.п3;
            наб3_Метод1(наб)
  ИНАЧЕ
                             п:=333;
    НаЭкран.Цел4числа("^п:=333 = %d ошибка^^",п,0,0,0);
                                      (* ошибка *)
  КОН;
КОН наб2_Метод2;

(*~~~~~~~~ задача-Метод наб3_Метод2 только для 3-го набора ~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА              (* (Набор3) *)
       наб3_Метод2(наб+:Набор3);                      (* ДЛЯ наб ВИДА  Набор3 *)
ПЕР
  п:ЦЕЛ;
УКАЗ
  ДЛЯ наб ВИДА
(*
  | Набор1: 
 (* Набор1 - не является расширением набора <наб>, а является его опорой *)
                             п:=наб.п1;
            наб1_Метод1(наб)
  | Набор2: 
 (* Набор2 - не является расширением набора <наб>, а является его предыдущей опорой *)
                             п:=наб.п2;
            наб2_Метод1(наб)
*)
  | Набор3:
                             п:=наб.п3;
            наб3_Метод1(наб)
  ИНАЧЕ
                             п:=333;
    НаЭкран.Цел4числа("^п:=333 = %d ошибка^^",п,0,0,0);
                                      (* ошибка *)
  КОН;
КОН наб3_Метод2;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Главная;
ПЕР
  н1:Набор1;
  н2:Набор2;
  н3:Набор3;

УКАЗ
  НаЭкран.ВсяЦепь("^^------ Проверка расширений (наследований) в наборах на Глаголе -------------");
                                                   (* начальные установки в наборах *)
  н3.п1:=11;
  н3.п2:=22;
  н3.п3:=33;

  НаЭкран.ВсяЦепь("^^...... вызов задачи наб1_Метод1(н3); ................^");
  наб1_Метод1(н3);
  НаЭкран.ВсяЦепь("^^...... вызов задачи наб2_Метод1(н3); ................^");
  наб2_Метод1(н3);
  НаЭкран.ВсяЦепь("^^...... вызов задачи наб3_Метод1(н3); ................^");
  наб3_Метод1(н3);

  НаЭкран.ВсяЦепь("^^...... вызов задачи наб1_Метод2(н3); ................^");
  наб1_Метод2(н3);
  НаЭкран.ВсяЦепь("^^...... вызов задачи наб2_Метод2(н3); ................^");
  наб2_Метод2(н3);
  НаЭкран.ВсяЦепь("^^...... вызов задачи наб3_Метод2(н3); ................^");
  наб3_Метод2(н3);

  НаЭкран.ВсяЦепь("^------ конец Проверки расширений (наследований) в наборах на Глаголе --------^");

КОН Главная;

(*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*)
УКАЗ
  Главная
КОН Расширения.
