{"id":34,"date":"2021-05-13T01:20:53","date_gmt":"2021-05-13T04:20:53","guid":{"rendered":"https:\/\/www.matiasvillagarcia.com\/blog\/?p=34"},"modified":"2021-05-16T22:29:56","modified_gmt":"2021-05-17T01:29:56","slug":"encapsulamiento-herencia-y-polimorfismo-en-abap","status":"publish","type":"post","link":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/2021\/05\/13\/encapsulamiento-herencia-y-polimorfismo-en-abap\/","title":{"rendered":"Encapsulamiento, Herencia y Polimorfismo en ABAP"},"content":{"rendered":"\n<p>Estaba refrescando un poco mi memoria de programaci\u00f3n orientada a objetos (OOP) en ABAP, y decid\u00ed hacer el siguiente ejemplo, usando los conceptos de Encapsulamiento, Herencia y Polimorfismo.<\/p>\n\n\n\n<p>Haciendo un ejemplo de polimorfismo podemos de paso abarcar tambi\u00e9n Herencia y Encapsulamiento, por ejemplo, digamos que queremos tener una clase con los atributos de veh\u00edculos, por ejemplo autos y motos. Para hacer esto podr\u00edamos definir una clase &#8220;Veh\u00edculos&#8221; que abarque a varios tipos de valga la redundancia veh\u00edculos.<\/p>\n\n\n\n<p>Primero definimos una clase abstracta llamada veh\u00edculo, una clase abstracta tiene la particularidad que solo necesitamos definir, la DEFINITION y no tiene IMPLEMENTATION. Esto lo usaremos de mano de la definici\u00f3n de m\u00e9todos para lograr polimorfismo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CLASS lcl_vehiculo DEFINITION ABSTRACT.\n\n  PUBLIC SECTION.\n    METHODS: obtener_tipo ABSTRACT,\n             obtener_marca ABSTRACT,\n             set_notas ABSTRACT\n              IMPORTING notas TYPE string,\n             ver_notas ABSTRACT\n              EXPORTING notas TYPE string.\n\n  PROTECTED SECTION.\n    DATA: lv_notas TYPE string.\n\nENDCLASS.<\/code><\/pre>\n\n\n\n<p>En el c\u00f3digo de arriba podemos ver que definimos la clase junto con sus m\u00e9todos (P\u00fablicos) y en la secci\u00f3n Protegida la variable notas (Aca tenemos un ejemplo de encapsulamiento, donde la variable al estar dentro de la secci\u00f3n PROTECTED solo puede ser accedida desde si misma y clases heredadas. Podr\u00edamos pensar de una clase abstracta como un template o una &#8220;receta&#8221; para luego definir otras clases.<\/p>\n\n\n\n<p>El paso siguiente seria por ejemplo definir una clase para los objetos de tipo auto usando la que ya tenemos.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CLASS lcl_auto DEFINITION\n               INHERITING FROM lcl_vehiculo.\n\n  PUBLIC SECTION.\n    METHODS: obtener_tipo REDEFINITION,\n             obtener_marca REDEFINITION,\n             set_notas REDEFINITION,\n             ver_notas REDEFINITION,\n             cantidad_puertas.\n\nENDCLASS.<\/code><\/pre>\n\n\n\n<p>En el c\u00f3digo de arriba definimos la clase lcl_auto y podemos ver la sentencia INHERITING FROM esto indica que estamos HEREDANDO la clase lcl_vehiculo, con todos sus m\u00e9todos y variables.<\/p>\n\n\n\n<p>Tambien podemos ver que esta clase (lcl_auto) tiene un m\u00e9todo mas (cantidad_puertas), cada clase sea heredada o no puede tener sus propios m\u00e9todos.<\/p>\n\n\n\n<p>En los m\u00e9todos podemos ver que tienen la palabra clave REDEFINITION, esto quiere decir que el m\u00e9todo lo vamos a redefinir para que haga lo que nosotros deseemos. Ahora creamos la implementacion de la clase.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CLASS lcl_auto IMPLEMENTATION.\n\n  METHOD obtener_tipo.\n    WRITE 'AUTO'.\n  ENDMETHOD.\n\n  METHOD obtener_marca.\n    WRITE 'FORD'.\n  ENDMETHOD.\n\n  METHOD set_notas.\n    lv_notas = notas.\n  ENDMETHOD.\n\n  METHOD ver_notas.\n    WRITE lv_notas.\n  ENDMETHOD.\n\n  METHOD cantidad_puertas.\n    WRITE '4'.\n  ENDMETHOD.\n\nENDCLASS.<\/code><\/pre>\n\n\n\n<p>En la implementacion de cada m\u00e9todo podemos poner lo que nosotros queremos que el mismo haga. Podemos ver particularmente en el m\u00e9todo set_notas que estamos seteando el valor de la variable lv_notas, esto es posible porque la misma esta declarada como PROTECTED, con lo cual una clase heredada puede modificar su valor. Si en lugar de PROTECTED fuese PRIVATE esto no seria posible.<\/p>\n\n\n\n<p>Ahora hacemos lo mismo que antes pero para un objeto moto.<\/p>\n\n\n\n<p>Primero declaramos la definici\u00f3n y luego la implementacion.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CLASS lcl_moto DEFINITION\n               INHERITING FROM lcl_vehiculo.\n\n  PUBLIC SECTION.\n    METHODS: obtener_tipo REDEFINITION,\n             obtener_marca REDEFINITION,\n             set_notas REDEFINITION,\n             ver_notas REDEFINITION.\n\nENDCLASS.<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>CLASS lcl_moto IMPLEMENTATION.\n\n  METHOD obtener_tipo.\n    WRITE 'MOTO'.\n  ENDMETHOD.\n\n  METHOD obtener_marca.\n    WRITE 'HONDA'.\n  ENDMETHOD.\n\n  METHOD set_notas.\n    lv_notas = notas.\n  ENDMETHOD.\n\n  METHOD ver_notas.\n    WRITE lv_notas.\n  ENDMETHOD.\n\nENDCLASS.<\/code><\/pre>\n\n\n\n<p>Como podemos ver en el ejemplo de arriba esta clase no tiene el m\u00e9todo cantidad_puertas.<\/p>\n\n\n\n<p>Finalmente solo resta hacer la declaraci\u00f3n de los objetos y su llamado.<\/p>\n\n\n\n<p>Para declarar los objetos hacemos lo siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\"Declaramos los objetos.\nDATA: lo_autos TYPE REF TO lcl_auto,\n      lo_motos TYPE REF TO lcl_moto.\n\n\"Creamos los objetos.\nCREATE OBJECT lo_autos.\nCREATE OBJECT lo_motos.<\/code><\/pre>\n\n\n\n<p>Primero creamos dos variables que van a contener los objetos y despu\u00e9s creamos los mismos.<\/p>\n\n\n\n<p>El ultimo paso es la llamada a los m\u00e9todos de los objetos<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CALL METHOD lo_autos-&gt;set_notas( 'ALGO Autos' ).\nCALL METHOD lo_motos-&gt;set_notas( 'ALGO 2 Motos').\n\n\nWRITE 'TIPO:'.\nCALL METHOD lo_autos-&gt;obtener_tipo( ).\nNEW-LINE.\nWRITE 'MARCA:'.\nCALL METHOD lo_autos-&gt;obtener_marca( ).\nNEW-LINE.\nWRITE 'NOTAS:'.\nCALL METHOD lo_autos-&gt;ver_notas( ).\nNEW-LINE.\nWRITE 'PUERTAS:'.\nCALL METHOD lo_autos-&gt;cantidad_puertas( ).\nNEW-LINE.\nWRITE '**************'.\nNEW-LINE.\nWRITE 'TIPO:'.\nCALL METHOD lo_motos-&gt;obtener_tipo( ).\nNEW-LINE.\nWRITE 'MARCA:'.\nCALL METHOD lo_motos-&gt;obtener_marca( ).\nNEW-LINE.\nWRITE 'NOTAS:'.\nCALL METHOD lo_motos-&gt;ver_notas( ).<\/code><\/pre>\n\n\n\n<p>Esto nos muestra como resultado:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"393\" height=\"273\" src=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/05\/image.png\" alt=\"\" class=\"wp-image-36\" srcset=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/05\/image.png 393w, https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/05\/image-300x208.png 300w\" sizes=\"auto, (max-width: 393px) 100vw, 393px\" \/><\/figure>\n\n\n\n<p>El c\u00f3digo completo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>*&amp;---------------------------------------------------------------------*\n*&amp; Report ZPOLYTEST2\n*&amp;---------------------------------------------------------------------*\n*&amp;\n*&amp;---------------------------------------------------------------------*\nREPORT ZPOLYTEST2.\n\n\"Ejemplo de encapsulamiento, herencia y polimorfismo en ABAP.\n\n\"Definimos una clase abstracta, podriamos llamarla una plantilla\n\"para las clases heredadas. Cuando definimos una clase como abstracta\n\"no tiene implementacion.\nCLASS lcl_vehiculo DEFINITION ABSTRACT.\n\n  PUBLIC SECTION.\n    METHODS: obtener_tipo ABSTRACT,\n             obtener_marca ABSTRACT,\n             set_notas ABSTRACT\n              IMPORTING notas TYPE string,\n             ver_notas ABSTRACT\n              EXPORTING notas TYPE string.\n\n  PROTECTED SECTION.\n    DATA: lv_notas TYPE string.\n\nENDCLASS.\n\n***********************************************************************\n\"Definimos una clase lcl_auto que hereda lcl_vehiculo y redefine los\n\"metodos de la clase padre (lcl_vehiculo).\nCLASS lcl_auto DEFINITION\n               INHERITING FROM lcl_vehiculo.\n\n  PUBLIC SECTION.\n    \"Los metodos con REDEFINITION son los originales de lcl_vehiculo.\n    \"Como podemos ver podemos agregar nuestros propios metodos\n    \"como por ejemplo cantidad_puertas que pertenece solo a esta clase.\n    METHODS: obtener_tipo REDEFINITION,\n             obtener_marca REDEFINITION,\n             set_notas REDEFINITION,\n             ver_notas REDEFINITION,\n             cantidad_puertas.\n\nENDCLASS.\n\n\"Implementamos la clase lcl_auto con sus metodos.\nCLASS lcl_auto IMPLEMENTATION.\n\n  METHOD obtener_tipo.\n    WRITE 'AUTO'.\n  ENDMETHOD.\n\n  METHOD obtener_marca.\n    WRITE 'FORD'.\n  ENDMETHOD.\n\n  METHOD set_notas.\n    lv_notas = notas.\n  ENDMETHOD.\n\n  METHOD ver_notas.\n    WRITE lv_notas.\n  ENDMETHOD.\n\n  METHOD cantidad_puertas.\n    WRITE '4'.\n  ENDMETHOD.\n\nENDCLASS.\n\n***********************************************************************\n\"Definimos una clase lcl_moto que hereda lcl_vehiculo y redefine los\n\"metodos de la clase padre (lcl_vehiculo).\nCLASS lcl_moto DEFINITION\n               INHERITING FROM lcl_vehiculo.\n\n  PUBLIC SECTION.\n    METHODS: obtener_tipo REDEFINITION,\n             obtener_marca REDEFINITION,\n             set_notas REDEFINITION,\n             ver_notas REDEFINITION.\n\nENDCLASS.\n\n\"Implementamos la clase lcl_moto con sus metodos.\nCLASS lcl_moto IMPLEMENTATION.\n\n  METHOD obtener_tipo.\n    WRITE 'MOTO'.\n  ENDMETHOD.\n\n  METHOD obtener_marca.\n    WRITE 'HONDA'.\n  ENDMETHOD.\n\n  METHOD set_notas.\n    lv_notas = notas.\n  ENDMETHOD.\n\n  METHOD ver_notas.\n    WRITE lv_notas.\n  ENDMETHOD.\n\nENDCLASS.\n\n***********************************************************************\nSTART-OF-SELECTION.\n\n\"Declaramos los objetos.\nDATA: lo_autos TYPE REF TO lcl_auto,\n      lo_motos TYPE REF TO lcl_moto.\n\n\"Creamos los objetos.\nCREATE OBJECT lo_autos.\nCREATE OBJECT lo_motos.\n\n\"Llamamos a los metodos que setean las notas.\nCALL METHOD lo_autos-&gt;set_notas( 'ALGO Autos' ).\nCALL METHOD lo_motos-&gt;set_notas( 'ALGO 2 Motos').\n\n\"Llamamos a los metodos que muestran la informacion.\nWRITE 'TIPO:'.\nCALL METHOD lo_autos-&gt;obtener_tipo( ).\nNEW-LINE.\nWRITE 'MARCA:'.\nCALL METHOD lo_autos-&gt;obtener_marca( ).\nNEW-LINE.\nWRITE 'NOTAS:'.\nCALL METHOD lo_autos-&gt;ver_notas( ).\nNEW-LINE.\nWRITE 'PUERTAS:'.\nCALL METHOD lo_autos-&gt;cantidad_puertas( ).\nNEW-LINE.\nWRITE '**************'.\nNEW-LINE.\nWRITE 'TIPO:'.\nCALL METHOD lo_motos-&gt;obtener_tipo( ).\nNEW-LINE.\nWRITE 'MARCA:'.\nCALL METHOD lo_motos-&gt;obtener_marca( ).\nNEW-LINE.\nWRITE 'NOTAS:'.\nCALL METHOD lo_motos-&gt;ver_notas( ).<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Estaba refrescando un poco mi memoria de programaci\u00f3n orientada a objetos (OOP) en ABAP, y decid\u00ed hacer el siguiente ejemplo, usando los conceptos de Encapsulamiento, Herencia y Polimorfismo. Haciendo un ejemplo de polimorfismo podemos de paso abarcar tambi\u00e9n Herencia y Encapsulamiento, por ejemplo, digamos que queremos tener una clase con los atributos de veh\u00edculos, por [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[3],"class_list":["post-34","post","type-post","status-publish","format-standard","hentry","category-abap","tag-abap"],"_links":{"self":[{"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/posts\/34","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=34"}],"version-history":[{"count":3,"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/posts\/34\/revisions"}],"predecessor-version":[{"id":40,"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/posts\/34\/revisions\/40"}],"wp:attachment":[{"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=34"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=34"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=34"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}