Кастынг у праграме ABAP

ВЫЗНАЧЭННЕ КЛАСА a1.
 ГРАМАДСКІЯ РАЗДЗЕЛ.
 ДАННЫЯ: ​​NUM1 TYPE i VALUE 100.
 МЕТАДЫ:m1.
 КАНЕЧНЫ КЛАС.
 РЭАЛІЗАЦЫЯ КЛАСА a1.
 МЕТАД m1.
 ЗАПІСІЦЬ: 'a1:', num1.
 КАНЕЧНЫ МЕТАД.
 КАНЕЧНЫ КЛАС.
 ВЫЗНАЧЭННЕ КЛАСА b1, якое пераймаецца ад a1.
 ГРАМАДСКІЯ РАЗДЗЕЛ.
 МЕТАДЫ: м2, м1 ПЕРАВЫЗНАЧЭННЕ.
 КАНЕЧНЫ КЛАС.
 РЭАЛІЗАЦЫЯ КЛАСА b1.
 МЕТАД m1.
 лік1 = колькасць1.
 ЗАПІСІЦЬ: 'b1:', num1.
 КАНЕЧНЫ МЕТАД.
 МЕТАД m2.
 НАПИШИТЕ: 'M2 у класе b1'.
 КАНЕЧНЫ МЕТАД.
 КАНЕЧНЫ КЛАС.
 ПАЧАТОК ВЫБОРУ.
 ДАННЫЯ: ​​a ТЫП СПРАВА ДА a1.
 ДАННЫЯ: ​​b ТЫП СПЫЛАЦЦА НА b1.
 *дадзеныя: c тыпу REF TO c1.
 ************************************************** *************** СТВАРЫЦЬ АБ'ЕКТ б.
 а = б.  "перадача ўверх МЕТАД ВЫЗУКА a->m1( ).
 *выклічце МЕТАД a->m2( ).  " мы не можам атрымаць доступ да ўласных метадаў падкласа з дапамогай суперкласа ref.
 НОВА-ЛІНІЯ.
 б ?= а.  " ліццё ўніз МЕТАД ВЫЗКУ b->m1( ).
 НОВА-ЛІНІЯ.
 МЕТАД ВЫЗУКА b->m2( ).
 ************************************************** *************** " памылка null ref create OBJECT a.
 б ?= а.  "дампаванне па-ранейшаму выклікае дамп метаду b->m1().
 ************************************************** *************** Стварыце аб'ект а.
 Паспрабуйце.
 б ?= а.  "Вы паспрабавалі выкарыстаць дамп спасылкі на аб'ект "NULL" CATCH cx_sy_move_cast_error.
 МЕТАД ВЫЗУКА b->m1( ).
 КАНЕЦ.
 ************************************************** *************** Стварыце аб'ект а.
 СТВАРЫЦЬ АБ'ЕКТ б.
 Паспрабуйце.
 б ?= а.
 ЗЛАВІЦЬ 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() МЕТАД ВЫЗУ o_cir->calc_area().
 УЛІНЭЯ.
 "--------- Вузкі кід (Upcast) ---------------" ДАННЫЯ: ​​o_shp TYPE REF TO lcl_shape.
 о_шп = о_цыр.  " Вузкі cast (Upcast) МЕТАД ВЫЗУ o_shp->draw( ).  "выклікае метад падкласа Draw() "выкліч МЕТОД 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() МЕТАД ВЫЗУ o_cir1->calc_area().
 ВЫЗНАЧЭННЕ КЛАСА a1.
 ГРАМАДСКІЯ РАЗДЗЕЛ.
 ДАННЫЯ: ​​NUM1 TYPE i VALUE 100.
 МЕТАДЫ:m1.
 КАНЕЧНЫ КЛАС.
 РЭАЛІЗАЦЫЯ КЛАСА a1.
 МЕТАД m1.
 ЗАПІСІЦЬ: 'a1:', num1.
 КАНЕЧНЫ МЕТАД.
 КАНЕЧНЫ КЛАС.
 ВЫЗНАЧЭННЕ КЛАСА b1, якое пераймаецца ад a1.
 ГРАМАДСКІЯ РАЗДЗЕЛ.
 МЕТАДЫ: м2, м1 ПЕРАВЫЗНАЧЭННЕ.
 КАНЕЧНЫ КЛАС.
 РЭАЛІЗАЦЫЯ КЛАСА b1.
 МЕТАД m1.
 лік1 = колькасць1.
 ЗАПІСІЦЬ: 'b1:', num1.
 КАНЕЧНЫ МЕТАД.
 МЕТАД m2.
 НАПИШИТЕ: 'M2 у класе b1'.
 КАНЕЧНЫ МЕТАД.
 КАНЕЧНЫ КЛАС.
 ПАЧАТОК ВЫБОРУ.
 ДАННЫЯ: ​​бацькоўскі ТЫП СПРАВА ДА a1.
 ДАННЫЯ: ​​дзіця ТЫП REF TO b1.
 *дадзеныя: c тыпу REF TO c1.
 ************************************************** *************** CREATE OBJECT дзіцяці.
 бацька = дзіця.  "павышанне бацькоўскага метаду выкліку->m1().
 МЕТАД ВЫЗКУ дзіцяці->m1( ).
 МЕТАД ВЫЗКУ дзіцяці->m2( ).
 *выклічце МЕТАД a->m2( ).  " мы не можам атрымаць доступ да ўласных метадаў падкласа з дапамогай суперкласа ref.
 НОВА-ЛІНІЯ.
 дзіця ?= бацька.  " ліццё ўніз МЕТАД ВЫЗКУ дзіцяці->m1( ).
 НОВА-ЛІНІЯ.
 МЕТАД ВЫЗКУ дзіцяці->m2( ).
 ************************************************** **************** *" памылка null ref *create OBJECT a.
 *b ?= а.  "дампаванне па-ранейшаму выдае *выкліч МЕТОД b->m1().
 ************************************************** **************** * Стварыце аб'ект а.
 Паспрабуйце.
 б ?= а.  "Вы паспрабавалі выкарыстаць дамп спасылкі на аб'ект "NULL" CATCH cx_sy_move_cast_error.
 МЕТАД ВЫЗУКА b->m1( ).
 КАНЕЦ.
 ************************************************** **************** * Стварыце аб'ект а.
 СТВАРЫЦЬ АБ'ЕКТ б.
 Паспрабуйце.
 б ?= а.
 ЗЛАВІЦЬ cx_sy_move_cast_error.
 МЕТАД ВЫЗУКА b->m1( ).
 выклікаць МЕТОД b->m2( ).
 КАНЕЦ.
 ******** Унікальныя значэнні******************* DATA: lv_string радок TYPE, lv_string2 радок TYPE, lv_string_final радок TYPE.
 ТЫПЫ: ПАЧАТАК ty_data, auth TYPE c, END OF ty_data.
 ДАННЫЯ: ​​ls_user TYPE ty_data, ls_user2 TYPE ty_data, lt_user2 TYPE TABLE TY_data, lt_user TYPE TABLE TY_data.
 lv_string = 'a,b,c,a'.
 lv_string2 = 'd,b,c,a'.
 РАЗДЗЕЛІЦЬ lv_string AT ',' НА ТАБЛІЦУ lt_user.
 РАЗДЗЕЛІЦЬ lv_string2 НА ',' НА ТАБЛІЦУ lt_user2.
 ПЕТЛЯ НА lt_user2 ПРЫЗНАВАННЕ ПОЛЯ-СІМВОЛ( ).
 УСТАВІЦЬ INTO TABLE lt_user.
 КАНЕЧНЫ ПЕТЛЬ.
 САРТАВАЦЬ lt_user ПА аўт.
 ВЫДАЛІЦЬ СУМЕЖНЫЯ ДУБЛІКАТЫ З lt_user ПАРАЎНАВАННЕ аўт.
 КАЛІ sy-subrc = 0.
 ПЕТЛЯ НА lt_user НАЗВЯДАННЕ ПОЛЯ-СІМВОЛ( ).
 КАЛІ lv_string_final з'яўляецца ПАЧЫТАЛЬНЫМ.
 lv_string_final = -аўт.
 ІНАША.
 КАНКАЦЫЯЦЬ lv_string_final -auth INTO lv_string_final, АДЗЕЛЕНЫЯ ','.
 ENDIF.
 КАНЕЧНЫ ПЕТЛЬ.
 ENDIF.

 

пакінуць каментар

Гэты сайт выкарыстоўвае Akismet для барацьбы са спамам. Даведайцеся, як дадзеныя апрацоўваюцца каментар.