Кастинг у програмі ABAP

ВИЗНАЧЕННЯ КЛАСУ a1.
 ГРОМАДСЬКИЙ РОЗДІЛ.
 ДАНІ: num1 TYPE i VALUE 100.
 МЕТОДИ: m1.
 КІНЦЕВИЙ КЛАС.
 РЕАЛІЗАЦІЯ КЛАСУ a1.
 СПОСІБ m1.
 НАПИШІТЬ: 'a1:', num1.
 КІНЦЕВИЙ МЕТОД.
 КІНЦЕВИЙ КЛАС.
 ВИЗНАЧЕННЯ КЛАСУ b1, НАСпадковане від a1.
 ГРОМАДСЬКИЙ РОЗДІЛ.
 МЕТОДИ: m2, m1 ПЕРЕВИзначення.
 КІНЦЕВИЙ КЛАС.
 РЕАЛІЗАЦІЯ КЛАСУ b1.
 СПОСІБ m1.
 число1 = число1.
 НАПИШІТЬ: 'b1:', num1.
 КІНЦЕВИЙ МЕТОД.
 СПОСІБ m2.
 НАПИШІТЬ: «M2 у класі b1».
 КІНЦЕВИЙ МЕТОД.
 КІНЦЕВИЙ КЛАС.
 ПОЧАТОК ВИБІРУ.
 ДАНІ: a ТИП ПОСИЛАННЯ НА a1.
 ДАНІ: b ТИП ПОСИЛАННЯ НА b1.
 *дані: тип c REF TO c1.
 ************************************************** ************ СТВОРИТИ ОБ'ЄКТ б.
 a = b.  "повсюдження методу виклику a->m1( ).
 *викликати МЕТОД a->m2( ).  " ми не можемо отримати доступ до власних методів підкласу, використовуючи посилання суперкласу.
 НОВИНКА.
 b ?= а.  " перекидання вниз методом виклику b->m1( ).
 НОВИНКА.
 МЕТОД ВИкликання b->m2( ).
 ************************************************** *************** " помилка null ref create OBJECT a.
 b ?= а.  "нижнє лиття все ще викликає виклик дампу METHOD b->m1( ).
 ************************************************** *************** СТВОРИТИ ОБ'ЄКТ a.
 СПРОБУЙТЕ.
 b ?= а.  "Ви спробували використати дамп посилання на об'єкт "NULL" CATCH cx_sy_move_cast_error.
 МЕТОД ВИкликання b->m1( ).
 КІНЕЦЬ.
 ************************************************** *************** СТВОРИТИ ОБ'ЄКТ a.
 СТВОРИТИ ОБ'ЄКТ b.
 СПРОБУЙТЕ.
 b ?= а.
 ПІВНЯТИ cx_sy_move_cast_error.
 МЕТОД ВИкликання b->m1( ).
 викликати МЕТОД b->m2( ).
 КІНЕЦЬ.
 КЛАС lcl_shape ВИЗНАЧЕННЯ.
 ГРОМАДСЬКИЙ РОЗДІЛ.
 МЕТОДИ малювання.
 КІНЦЕВИЙ КЛАС.
 КЛАС lcl_circle ВИЗНАЧЕННЯ, НАСпадковане від lcl_shape.
 ГРОМАДСЬКИЙ РОЗДІЛ.
 МЕТОДИ: намалювати ПЕРЕВИЗНАЧЕННЯ, calc_area.
 КІНЦЕВИЙ КЛАС.
 КЛАС lcl_shape РЕАЛІЗАЦІЯ.
 СПОСІБ малювання.
 WRITE :/ 'Малювання будь-якої фігури'.
 КІНЦЕВИЙ МЕТОД.
 КІНЦЕВИЙ КЛАС.
 КЛАС lcl_circle РЕАЛІЗАЦІЯ.
 СПОСІБ малювання.
 WRITE :/ 'Спеціальна форма малюнку: коло'.
 КІНЦЕВИЙ МЕТОД.
 МЕТОД calc_area.
 WRITE :/ 'Площа Crcle = 2iiR'.
 КІНЦЕВИЙ МЕТОД.
 КІНЦЕВИЙ КЛАС.
 ПОЧАТОК ВИБІРУ.
 ДАНІ: o_cir TYPE REF TO lcl_circle.
 СТВОРИТИ ОБ’ЄКТ o_cir.
 МЕТОД ВИкликання o_cir->draw( ).  " викликає метод підкласу Draw() CALL METHOD o_cir->calc_area().
 ULINE.
 "-------- Вузький перехід (Upcast)--------------" ДАНІ: o_shp TYPE REF TO lcl_shape.
 o_shp = o_cir.  " Вузький cast (Upcast) МЕТОД ВИкликання o_shp->draw( ).  " викликає метод підкласу Draw() "викликає METHOD o_shp->calc_area() .  " помилка компіляції ULINE.
 "--------- Розширення Cast(Downcast) -----------" ДАНІ: o_cir1 TYPE REF TO lcl_circle.
 " o_cir1 = o_shp.  " помилка компіляції o_cir1 ?= o_shp.  " Розширення Cast(Downcast) МЕТОД ВИкликання o_cir1->draw( ).  " викликає метод підкласу Draw() CALL METHOD o_cir1->calc_area().
 ВИЗНАЧЕННЯ КЛАСУ a1.
 ГРОМАДСЬКИЙ РОЗДІЛ.
 ДАНІ: num1 TYPE i VALUE 100.
 МЕТОДИ: m1.
 КІНЦЕВИЙ КЛАС.
 РЕАЛІЗАЦІЯ КЛАСУ a1.
 СПОСІБ m1.
 НАПИШІТЬ: 'a1:', num1.
 КІНЦЕВИЙ МЕТОД.
 КІНЦЕВИЙ КЛАС.
 ВИЗНАЧЕННЯ КЛАСУ b1, НАСпадковане від a1.
 ГРОМАДСЬКИЙ РОЗДІЛ.
 МЕТОДИ: m2, m1 ПЕРЕВИзначення.
 КІНЦЕВИЙ КЛАС.
 РЕАЛІЗАЦІЯ КЛАСУ b1.
 СПОСІБ m1.
 число1 = число1.
 НАПИШІТЬ: 'b1:', num1.
 КІНЦЕВИЙ МЕТОД.
 СПОСІБ m2.
 НАПИШІТЬ: «M2 у класі b1».
 КІНЦЕВИЙ МЕТОД.
 КІНЦЕВИЙ КЛАС.
 ПОЧАТОК ВИБІРУ.
 ДАНІ: батьківський ТИП ПОСИЛАННЯ НА a1.
 ДАНІ: дитина ТИП ПОСИЛАННЯ ДО b1.
 *дані: тип c REF TO c1.
 ************************************************** *************** CREATE OBJECT дочірній.
 батько = дитина.  "поновлення батьківського методу виклику->m1( ).
 МЕТОД ВИВІКУ дочірній->m1( ).
 МЕТОД ВИВІКУ дочірній->m2( ).
 *викликати МЕТОД a->m2( ).  " ми не можемо отримати доступ до власних методів підкласу, використовуючи посилання суперкласу.
 НОВИНКА.
 дитина ?= батько.  " переведення вниз методом виклику child->m1( ).
 НОВИНКА.
 МЕТОД ВИВІКУ дочірній->m2( ).
 ************************************************** **************** *" помилка null ref *create OBJECT a.
 *b ?= a.  "залиття вниз все ще дає дамп *викличте METHOD b->m1( ).
 ************************************************** **************** * СТВОРИТИ ОБ'ЄКТ a.
 СПРОБУЙТЕ.
 b ?= а.  "Ви спробували використати дамп посилання на об'єкт "NULL" CATCH cx_sy_move_cast_error.
 МЕТОД ВИкликання b->m1( ).
 КІНЕЦЬ.
 ************************************************** **************** * СТВОРИТИ ОБ'ЄКТ a.
 СТВОРИТИ ОБ'ЄКТ b.
 СПРОБУЙТЕ.
 b ?= а.
 ПІВНЯТИ cx_sy_move_cast_error.
 МЕТОД ВИкликання b->m1( ).
 викликати МЕТОД b->m2( ).
 КІНЕЦЬ.
 ******** Унікальні значення******************* ДАНІ: рядок TYPE lv_string, рядок TYPE lv_string2, рядок TYPE lv_string_final.
 ТИПИ: BEGIN OF ty_data, auth TYPE c, END OF ty_data.
 ДАНІ: ls_user TYPE ty_data, ls_user2 TYPE ty_data, lt_user2 TYPE ТАБЛИЦЯ ty_data, lt_user TYPE ТАБЛИЦЯ ty_data.
 lv_string = 'a,b,c,a'.
 lv_string2 = 'd,b,c,a'.
 РОЗДІЛИТИ lv_string AT ',' НА ТАБЛИЦЮ lt_user.
 РОЗДІЛИТИ lv_string2 В ',' НА ТАБЛИЦЮ lt_user2.
 LOOP AT lt_user2 ПРИЗНАЧЕННЯ ПОЛЯ-СИМВОЛА( ).
 ВСТАВИТИ INTO TABLE lt_user.
 ENDLOOP.
 СОРТУВАТИ lt_user ЗА авторизацією.
 ВИДАЛИТИ СУМІЖНІ ДУБЛІКАТИ ІЗ lt_user COMPARING auth.
 ЯКЩО sy-subc = 0.
 LOOP AT lt_user ПРИЗНАЧЕННЯ ПОЛЯ-СИМВОЛ( ).
 ЯКЩО lv_string_final IS INITIAL.
 lv_string_final = -авт.
 ІНШЕ.
 КОНКАТЕНАТИ lv_string_final -auth INTO lv_string_final РОЗДІЛЕНО ','.
 ENDIF.
 ENDLOOP.
 ENDIF.

 

Залишити коментар

Цей сайт використовує Akismet для зменшення спаму. Дізнайтеся, як обробляються ваші дані коментарів.