Casting ABAP-ohjelmassa

LUOKAN a1 MÄÄRITELMÄ.
 JULKINEN OSIO.
 TIEDOT: num1 TYYPPI i ARVO 100.
 MENETELMÄT:m1.
 LOPPUSUOJA.
 LUOKAN a1 TOTEUTUS.
 MENETELMÄ m1.
 KIRJOITTAA: 'a1:',num1.
 LOPETUSMENETELMÄ.
 LOPPUSUOJA.
 LUOKAN b1 MÄÄRITELMÄ PERINTYY a1:lta.
 JULKINEN OSIO.
 MENETELMÄT:m2, m1 UUDELLEENMÄÄRITELMÄ.
 LOPPUSUOJA.
 LUOKAN b1 TOTEUTUS.
 MENETELMÄ m1.
 numero1 = numero1.
 KIRJOITA: 'b1:', numero1.
 LOPETUSMENETELMÄ.
 MENETELMÄ m2.
 KIRJOITA: "M2 luokassa b1".
 LOPETUSMENETELMÄ.
 LOPPUSUOJA.
 VALINTA ALKU.
 TIEDOT: a TYYPPI VIITE a1.
 TIEDOT: b TYYPPI VIITE b1.
 *tiedot: c tyyppi VIITE c1.
 ***************************************************** ************** LUO OBJEKTI b.
 a = b.  "upcasting CALL METHOD a->m1( ).
 *soita METHOD a->m2( ).  " emme voi käyttää omia alaluokkamenetelmiä käyttämällä superluokan ref.
 UUSI RIVI.
 b ?= a.  " alaspäin casting CALL METHOD b->m1( ).
 UUSI RIVI.
 KUITTAUSMENETELMÄ b->m2( ).
 ***************************************************** *************** " virhe null ref luo OBJEKTI a.
 b ?= a.  "downcasting edelleen sen antava dump-kutsu METHOD b->m1( ).
 ***************************************************** ************** LUO OBJEKTI a.
 YRITTÄÄ.
 b ?= a.  "yritit käyttää 'NULL'-objektiviittausvedoskirjaa CATCH cx_sy_move_cast_error.
 KUITTAUSMENETELMÄ b->m1( ).
 ENDTRY.
 ***************************************************** ************** LUO OBJEKTI a.
 LUO OBJEKTI b.
 YRITTÄÄ.
 b ?= a.
 CATCH cx_sy_move_cast_error.
 KUITTAUSMENETELMÄ b->m1( ).
 kutsu METHOD b->m2( ).
 ENDTRY.
 LUOKAN lcl_shape MÄÄRITELMÄ.
 JULKINEN OSIO.
 METODIT piirtää.
 LOPPUSUOJA.
 LUOKKA lcl_circle MÄÄRITELMÄ PERITÄÄN lcl_muodosta.
 JULKINEN OSIO.
 MENETELMÄT: piirrä REDEFINITION, calc_area.
 LOPPUSUOJA.
 LUOKAN lcl_shape TOTEUTUS.
 MENETELMÄ piirtää.
 KIRJOITTAA :/ 'Mikä tahansa muodon piirtäminen'.
 LOPETUSMENETELMÄ.
 LOPPUSUOJA.
 LUOKAN lcl_circle TOTEUTUS.
 MENETELMÄ piirtää.
 WRITE :/ 'Tietyneen muodon piirtäminen: Ympyrä'.
 LOPETUSMENETELMÄ.
 MENETELMÄ laskenta-ala.
 KIRJOITTAA :/ 'Krclen alue = 2iiR'.
 LOPETUSMENETELMÄ.
 LOPPUSUOJA.
 VALINTA ALKU.
 TIEDOT: o_cir TYYPPI REF lcl_circle.
 LUO OBJEKTI o_cir.
 CALL METHOD o_cir->draw( ).  " kutsuu alaluokkaa Draw() -menetelmää CALL METHOD o_cir->calc_area( ).
 ULINE.
 "--------- Kapea cast (Upcast)----------------" TIEDOT : o_shp TYYPPI VIITE lcl_shape.
 o_shp = o_cir.  " Kapea cast(Upcast) CALL METHOD o_shp->draw( ).  " kutsuu alaluokkaa Draw() -menetelmää "kutsua METHOD o_shp->calc_area( ) .  " käännösvirhe ULINE.
 "---------- Laajenna Cast(Downcast) -----------" TIEDOT : o_cir1 TYYPPI VIITE lcl_circle.
 " o_cir1 = o_shp.  " täydennysvirhe o_cir1 ?= o_shp.  " Laajenna Cast(Downcast) CALL METHOD o_cir1->draw( ).  " kutsuu alaluokkaa Draw() -metodia CALL METHOD o_cir1->calc_area( ).
 LUOKAN a1 MÄÄRITELMÄ.
 JULKINEN OSIO.
 TIEDOT: num1 TYYPPI i ARVO 100.
 MENETELMÄT:m1.
 LOPPUSUOJA.
 LUOKAN a1 TOTEUTUS.
 MENETELMÄ m1.
 KIRJOITTAA: 'a1:',num1.
 LOPETUSMENETELMÄ.
 LOPPUSUOJA.
 LUOKAN b1 MÄÄRITELMÄ PERINTYY a1:lta.
 JULKINEN OSIO.
 MENETELMÄT:m2, m1 UUDELLEENMÄÄRITELMÄ.
 LOPPUSUOJA.
 LUOKAN b1 TOTEUTUS.
 MENETELMÄ m1.
 numero1 = numero1.
 KIRJOITA: 'b1:', numero1.
 LOPETUSMENETELMÄ.
 MENETELMÄ m2.
 KIRJOITA: "M2 luokassa b1".
 LOPETUSMENETELMÄ.
 LOPPUSUOJA.
 VALINTA ALKU.
 TIEDOT: vanhempi TYYPPI VIITE a1.
 TIEDOT: lapsi TYYPPI VIITE b1.
 *tiedot: c tyyppi VIITE c1.
 ***************************************************** ************** LUO OBJEKTI-lapsi.
 vanhempi = lapsi.  "upcasting CALL METHOD parent->m1( ).
 SOITTAUSTAPA lapsi->m1( ).
 SOITTAUSTAPA lapsi->m2( ).
 *soita METHOD a->m2( ).  " emme voi käyttää omia alaluokkamenetelmiä käyttämällä superluokan ref.
 UUSI RIVI.
 lapsi? = vanhempi.  " alas heitto PUHELUTAPA lapsi->m1( ).
 UUSI RIVI.
 SOITTAUSTAPA lapsi->m2( ).
 ***************************************************** **************** *" virhe null ref *luo OBJEKTI a.
 *b ?= a.  "alasvalu edelleen sen antamisen kaatopaikka *soita METHOD b->m1( ).
 ***************************************************** *************** * LUO OBJEKTI a.
 YRITTÄÄ.
 b ?= a.  "yritit käyttää 'NULL'-objektiviittausvedoskirjaa CATCH cx_sy_move_cast_error.
 KUITTAUSMENETELMÄ b->m1( ).
 ENDTRY.
 ***************************************************** *************** * LUO OBJEKTI a.
 LUO OBJEKTI b.
 YRITTÄÄ.
 b ?= a.
 CATCH cx_sy_move_cast_error.
 KUITTAUSMENETELMÄ b->m1( ).
 kutsu METHOD b->m2( ).
 ENDTRY.
 ******* Yksilölliset arvot******************* DATA: lv_string TYPE-merkkijono, lv_string2 TYPE-merkkijono, lv_string_final TYPE-merkkijono.
 TYYPIT: TY_data BEGIN OF TYPE c, todennus TYPE c, END OF ty_data.
 TIEDOT: ls_user TYPE ty_data, ls_user2 TYPE ty_data, lt_user2 TYPE TY_TABLE OF ty_data, lt_user TYYPPI ty_data TABLE.
 lv_string = 'a,b,c,a'.
 lv_string2 = 'd,b,c,a'.
 JAKAA lv_string AT ',' TABLE:ksi lt_user.
 JAKAA lv_string2 AT ',' TABLE lt_user2.
 SILMUKAUS KENTTÄSYMBOLIN ( ).
 LISÄÄ TABLE lt_user.
 ENDLOOP.
 LAJITTELU lt_user Auth.
 POISTA LÄHETTÄVÄT DUPLIKAATIT LT_käyttäjästä VERTAILE auth.
 JOS sy-subrc = 0.
 SILMUKAUS lt_user ASSIGNING FIELD-SYMBOL( ).
 JOS lv_string_final ON ALKUPERÄINEN.
 lv_string_final = -tod.
 MUU.
 CONCATENATE lv_string_final -auth INTO lv_string_final EROTTAMALLA ','.
 LOPPU JOS.
 ENDLOOP.
 LOPPU JOS.

 

Jätä kommentti

Tämä sivusto käyttää Akismetiä roskapostin vähentämiseksi. Lue, miten kommenttitietosi käsitellään.