Кастинг в программе ABAP

КЛАСС a1 ОПРЕДЕЛЕНИЕ.
 ОБЩЕСТВЕННЫЙ РАЗДЕЛ.
 ДАННЫЕ: num1 ТИП i ЗНАЧЕНИЕ 100.
 МЕТОДЫ: m1.
 КОНЕЦКЛАСС.
 КЛАСС a1 РЕАЛИЗАЦИЯ.
 МЕТОД м1.
 НАПИСАТЬ: 'a1:', num1.
 КОНЕЦ МЕТОД.
 КОНЕЦКЛАСС.
 ОПРЕДЕЛЕНИЕ КЛАССА b1, НАСЛЕДУЮЩЕЕ ОТ a1.
 ОБЩЕСТВЕННЫЙ РАЗДЕЛ.
 МЕТОДЫ: m2, m1 ПЕРЕОПРЕДЕЛЕНИЕ.
 КОНЕЦКЛАСС.
 КЛАСС b1 РЕАЛИЗАЦИЯ.
 МЕТОД м1.
 число1 = число1 .
 НАПИСАТЬ: 'b1:', num1.
 КОНЕЦ МЕТОД.
 МЕТОД м2.
 НАПИШИТЕ: «M2 в классе b1».
 КОНЕЦ МЕТОД.
 КОНЕЦКЛАСС.
 НАЧАЛО ВЫБОРА.
 ДАННЫЕ: ТИП ССЫЛКА a1.
 ДАННЫЕ: ТИП b ССЫЛКА b1.
 *данные: тип c ССЫЛКА на c1.
 ******************************************************* ************** СОЗДАТЬ ОБЪЕКТ б.
 а = б.  "возведение вверх по методу CALL METHOD a->m1().
 *вызвать МЕТОД a->m2( ).  «мы не можем получить доступ к собственным методам подкласса, используя ссылку суперкласса.
 НОВАЯ ЛИНИЯ.
 б ?= а.  " нисходящее приведение CALL METHOD b->m1().
 НОВАЯ ЛИНИЯ.
 МЕТОД ВЫЗОВА b->m2( ).
 ******************************************************* *************** "ошибка null ref create OBJECT a.
 б ?= а.  "приведение вниз по-прежнему дает вызов дампа METHOD b->m1().
 ******************************************************* *************** СОЗДАТЬ ОБЪЕКТ a.
 ПЫТАТЬСЯ.
 б ?= а.  «Вы попытались использовать дамп ссылки на объект NULL CATCH cx_sy_move_cast_error.
 МЕТОД ВЫЗОВА b->m1( ).
 КОНЕЦ.
 ******************************************************* *************** СОЗДАТЬ ОБЪЕКТ a.
 СОЗДАТЬ ОБЪЕКТ б.
 ПЫТАТЬСЯ.
 б ?= а.
 CATCH cx_sy_move_cast_error.
 МЕТОД ВЫЗОВА b->m1( ).
 вызвать МЕТОД b->m2().
 КОНЕЦ.
 КЛАСС lcl_shape ОПРЕДЕЛЕНИЕ.
 ОБЩЕСТВЕННЫЙ РАЗДЕЛ.
 МЕТОДЫ розыгрыша.
 КОНЕЦКЛАСС.
 КЛАСС lcl_circle ОПРЕДЕЛЕНИЕ, НАСЛЕДУЮЩЕЕ ОТ lcl_shape.
 ОБЩЕСТВЕННЫЙ РАЗДЕЛ.
 МЕТОДЫ: нарисовать ПЕРЕОПРЕДЕЛЕНИЕ, calc_area.
 КОНЕЦКЛАСС.
 КЛАСС lcl_shape РЕАЛИЗАЦИЯ.
 МЕТОД розыгрыша.
 НАПИСАТЬ: / «Рисование любой формы».
 КОНЕЦ МЕТОД.
 КОНЕЦКЛАСС.
 КЛАСС lcl_circle РЕАЛИЗАЦИЯ.
 МЕТОД розыгрыша.
 НАПИСАТЬ :/ 'Рисование определенной формы: круг'.
 КОНЕЦ МЕТОД.
 МЕТОД calc_area.
 НАПИШИТЕ: / «Площадь круга = 2iiR».
 КОНЕЦ МЕТОД.
 КОНЕЦКЛАСС.
 НАЧАЛО ВЫБОРА.
 ДАННЫЕ: o_cir TYPE REF TO lcl_circle.
 СОЗДАТЬ ОБЪЕКТ o_cir.
 МЕТОД ВЫЗОВА o_cir->draw().  " вызывает метод Draw() подкласса CALL METHOD o_cir->calc_area().
 УЛИН.
 "--------- Узкое литье (Upcast)---------------" ДАННЫЕ: o_shp TYPE REF TO lcl_shape.
 о_шп = о_цир.  " Узкое приведение (Upcast) МЕТОД ВЫЗОВА o_shp->draw().  "вызывает метод Draw() подкласса" вызывает МЕТОД o_shp->calc_area() .  "Ошибка компиляции ULINE.
 "---------- Расширяющийся бросок (Downcast) -----------" ДАННЫЕ: o_cir1 ТИП ССЫЛКА НА lcl_circle.
 " о_цир1 = о_шп.  "Ошибка компиляции o_cir1 ?= o_shp.  МЕТОД ВЫЗОВА МЕТОД ВЫЗОВА o_cir1->draw().  " вызывает метод Draw() подкласса CALL METHOD o_cir1->calc_area().
 КЛАСС a1 ОПРЕДЕЛЕНИЕ.
 ОБЩЕСТВЕННЫЙ РАЗДЕЛ.
 ДАННЫЕ: num1 ТИП i ЗНАЧЕНИЕ 100.
 МЕТОДЫ: m1.
 КОНЕЦКЛАСС.
 КЛАСС a1 РЕАЛИЗАЦИЯ.
 МЕТОД м1.
 НАПИСАТЬ: 'a1:', num1.
 КОНЕЦ МЕТОД.
 КОНЕЦКЛАСС.
 ОПРЕДЕЛЕНИЕ КЛАССА b1, НАСЛЕДУЮЩЕЕ ОТ a1.
 ОБЩЕСТВЕННЫЙ РАЗДЕЛ.
 МЕТОДЫ: m2, m1 ПЕРЕОПРЕДЕЛЕНИЕ.
 КОНЕЦКЛАСС.
 КЛАСС b1 РЕАЛИЗАЦИЯ.
 МЕТОД м1.
 число1 = число1 .
 НАПИСАТЬ: 'b1:', num1.
 КОНЕЦ МЕТОД.
 МЕТОД м2.
 НАПИШИТЕ: «M2 в классе b1».
 КОНЕЦ МЕТОД.
 КОНЕЦКЛАСС.
 НАЧАЛО ВЫБОРА.
 ДАННЫЕ: родительский ТИП ССЫЛКА на a1.
 ДАННЫЕ: ребенок ТИП ССЫЛКА b1.
 *данные: тип c ССЫЛКА на c1.
 ******************************************************* ************** СОЗДАТЬ ОБЪЕКТ ребенка.
 родитель = ребенок.  "возведение вверх по методу CALL METHOD parent->m1().
 МЕТОД ВЫЗОВА child->m1( ).
 МЕТОД ВЫЗОВА child->m2( ).
 *вызвать МЕТОД a->m2( ).  «мы не можем получить доступ к собственным методам подкласса, используя ссылку суперкласса.
 НОВАЯ ЛИНИЯ.
 ребенок ?= родитель.  " нисходящее приведение CALL METHOD child->m1().
 НОВАЯ ЛИНИЯ.
 МЕТОД ВЫЗОВА child->m2( ).
 ******************************************************* *************** *" ошибка null ref *create OBJECT a.
 *б ?= а.  «приведение вниз по-прежнему дает дамп * call METHOD b-> m1 ().
 ******************************************************* *************** * СОЗДАТЬ ОБЪЕКТ a.
 ПЫТАТЬСЯ.
 б ?= а.  «Вы попытались использовать дамп ссылки на объект NULL CATCH cx_sy_move_cast_error.
 МЕТОД ВЫЗОВА b->m1( ).
 КОНЕЦ.
 ******************************************************* *************** * СОЗДАТЬ ОБЪЕКТ a.
 СОЗДАТЬ ОБЪЕКТ б.
 ПЫТАТЬСЯ.
 б ?= а.
 CATCH cx_sy_move_cast_error.
 МЕТОД ВЫЗОВА b->m1( ).
 вызвать МЕТОД b->m2().
 КОНЕЦ.
 ******** Уникальные значения****************** ДАННЫЕ: lv_string TYPE string, lv_string2 TYPE string, lv_string_final TYPE string.
 ТИПЫ: НАЧАЛО ty_data, ТИП авторизации c, КОНЕЦ ty_data.
 ДАННЫЕ: ls_user TYPE ty_data, ls_user2 TYPE ty_data, lt_user2 TYPE TABLE OF ty_data, lt_user TYPE TABLE OF ty_data.
 lv_string = 'а, б, в, а'.
 lv_string2 = 'г, б, в, а'.
 РАЗДЕЛИТЬ lv_string AT ',' В ТАБЛИЦУ lt_user.
 РАЗДЕЛИТЬ lv_string2 AT ',' В ТАБЛИЦУ lt_user2.
 ЦИКЛ В lt_user2 НАЗНАЧЕНИЕ ПОЛЯ-СИМВОЛ( ).
 ВСТАВЛЯТЬ В ТАБЛИЦУ lt_user.
 КОНЕЦ.
 SORT lt_user ПО авторизации.
 УДАЛИТЬ СМЕЖНЫЕ ДУБЛИКИ ОТ lt_user СРАВНЕНИЕ auth.
 ЕСЛИ sy-subrc = 0.
 LOOP AT lt_user НАЗНАЧЕНИЕ ПОЛЯ-СИМВОЛ( ).
 ЕСЛИ lv_string_final ЯВЛЯЕТСЯ НАЧАЛЬНЫМ.
 lv_string_final = -авт.
 ЕЩЕ.
 СЦЕПИТЬ lv_string_final -auth INTO lv_string_final, ОТДЕЛЕННЫХ ','.
 КОНЕЦ.
 КОНЕЦ.
 КОНЕЦ.

 

Оставить комментарий

Этот сайт использует Akismet для уменьшения количества спама. Узнайте, как обрабатываются ваши данные комментариев.