Analizar y probar el código
Uso correcto de tipos de datos y conversiones de tipos
Campos de caracteres de procesamiento
Uso de la transferencia de código en ABAP SQL
Mejora del rendimiento de la tabla interna
Implementar verificaciones de autorización
Diseño de código orientado a objetos efectivo
Definir y trabajar con clases de excepción
Añadir documentación al código ABAP

Definición de interfaces

Objective

After completing this lesson, you will be able to definir interfaces.

Definición de interfaz

Motivos para utilizar interfaces

Las interfaces permiten definir cómo un programa hará referencia a una o más clases. En una interfaz, puede definir métodos, atributos, tipos y constantes, como lo haría en una clase. Estos componentes forman una descripción de cómo un mandante programa podría interactuar con los objetos correspondientes. Sin embargo, una interfaz no puede instanciarse ni contiene implementaciones de sus métodos. Para conseguir que funcione el concepto, también hay una o varias clases que implementen la interfaz. Esto significa que incluyen la interfaz en su propia declaración de clase y los componentes que se declaran en la interfaz se convierten en parte de la propia clase. Si la interfaz contiene declaraciones de método, la clase que implementa la interfaz también debe proporcionar una implementación de esos métodos.

Las interfaces tienen dos importantes usos:

Proporcionar un enfoque unificado a diferentes clases: si tiene clases que no están relacionadas por herencia, pero que aún deben proporcionar servicios comunes a sus usuarios, puede definir los servicios comunes en una interfaz. De este modo se garantiza que cada clase proporcione un método con el mismo nombre y la misma firma para realizar una tarea concreta. Entonces, los programas que utilizan las clases tendrán una única manera de llamar funciones en particular, independientemente a qué clase están realmente dirigidos.

Proporcionar un enfoque simplificado a una clase compleja: Como verá más adelante, las interfaces proporcionan una vista restringida de un objeto. Esto le permite exponer un determinado conjunto de métodos a un programa que utilizará una clase determinada en función de las funciones que realmente requiere el programa.

Vea este ejemplo para saber cómo funciona una interfaz.

Definición de interfaz

La definición de una interfaz es muy similar a la sección de definición de una clase. Sin embargo, dado que una interfaz no tiene una implementación, no hay complemento de DEFINITION en la sentencia de INTERFACE. La segunda diferencia principal es que no hay secciones de visibilidad en una interfaz, puesto que todos los componentes de una interfaz son públicos. Las interfaces son últiles gracias a su interacción con otras clases, así que tener componentes no públicos no tendría sentido.

En la definición de la interfaz, puede utilizar clases, atributos, constantes y métodos y se permiten tanto componentes de instancia como estáticos. Recuerde que los métodos de interfaz tienen definición, pero no implementación. La clase de implementación proporcionará la implementación.

En muchos sentidos, las interfaces son similares a las súper clases abstractas. Proporcionan una técnica útil para casos en ls que necesita definir componentes comunes para clases que necesidad que de que exista una caso para herencia. En otras palabras, no hay ninguna relación clara "es un".

Implementación de la interfaz

Para implementar una interfaz en una clase, utilice la sentencia INTERFACES. Como todos los componentes de la interfaz son públicos y no puede modificar la visibilidad de un componente existente, deberá incluir la interfaz en la sección pública de la clase.

En cuanto haya escrito la sentencia INTERFACES, su programa será sintácticamente incorrecto. Esto se debe a que la interfaz contiene un método que aún no ha implementado. Puede utilizar una corrección rápida (Ctrl + 1) para añadir la implementación del método a su clase.

Al declarar una interfaz en una clase, debe implementar todos sus métodos.

En la implementación de su clase, debe implementar todos los métodos que se declaran en la interfaz. Al nombrar el método en la implementación, debe utilizar el nombre completamente cualificado, que consta del nombre de interfaz y el nombre del método unidos por una tilde. Esto se debe a que no hay ninguna garantía de que el nombre del método por sí mismo sea unívoco. Recuerde que los nombres de componente solo deben ser únicos en la clase o interfaz en la cual se declaran. En consecuencia, una clase podría declarar un método llamado get_partner_attributes, así como la interfaz lif_partner.

Pruébelo: Definición de interfaz

  1. Cree una clase nueva que implemente la interfaz IF_OO_ADT_CLASSRUN.
  2. Cambie a la pestaña Tipos locales y copie el siguiente fragmento de código en el editor:
    Code Snippet
    123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
    INTERFACE lif_partner. METHODS get_partner_attributes. ENDINTERFACE. CLASS lcl_travel_Agency DEFINITION. PUBLIC SECTION. ENDCLASS. CLASS lcl_airline DEFINITION. PUBLIC SECTION. INTERFACES lif_Partner. TYPES: BEGIN OF ts_detail, name TYPE string, value TYPE string, END OF ts_detail, tt_Details TYPE SORTED TABLE OF ts_detail WITH UNIQUE KEY name. METHODS get_details RETURNING VALUE(rt_details) TYPE tt_details. ENDCLASS. CLASS lcl_car_Rental DEFINITION. PUBLIC SECTION. interfaces lif_Partner. TYPES: BEGIN OF ts_info, name TYPE c LENGTH 20, value TYPE c LENGTH 20, END OF ts_info, tt_Info TYPE SORTED TABLE OF ts_info WITH UNIQUE KEY name. METHODS get_information RETURNING VALUE(rt_details) TYPE tt_info. ENDCLASS. CLASS lcl_airline IMPLEMENTATION. METHOD get_details. ENDMETHOD. METHOD lif_partner~get_partner_attributes. ENDMETHOD. ENDCLASS. CLASS lcl_car_rental IMPLEMENTATION. METHOD get_information. ENDMETHOD. METHOD lif_partner~get_partner_attributes. ENDMETHOD. ENDCLASS.
  3. Pulse Ctrl + F3 para activar la clase.
  4. Familiarícese con el código.

    Nota

    No hay ningún código ejecutable en este ejemplo.

Definir e implementar una interfaz

Se da cuenta de que el método GET_OUTPUT en la clase local LCL_CARRIER y el método GET_DESCRIPTION en la clase local LCL_FLIGHT son muy similares. Para armonizar la definición, introduzca una interfaz e impleméntela en ambas clases.

Modelo:

  • /LRN/CL_S4D401_OOS_INH_USAGE (clase global)

Solución:

  • /LRN/CL_S4D401_OOS_INTERFACE (clase global)

Tarea 1: Copiar plantilla (opcional)

Copie la clase de modelo /LRN/CL_S4D401_OOS_INH_USAGE. Si ha finalizado el ejercicio anterior, puede omitir esta tarea y continuar editando su clase ZCL_##_SOLUTION.

Pasos

  1. Copie la clase /LRN/CL_S4D401_OOS_INH_USAGE en una clase de su propio paquete (nombre sugerido: ZCL_##_SOLUTION, donde ## representa su número de grupo).

    1. En el Explorador de proyectos, haga clic con el botón derecho en la clase /LRN/CL_S4D401_OOS_INH_USAGE para abrir el menú contextual.

    2. En el menú contextual, seleccione Duplicar....

    3. Introduzca el nombre del paquete en el campo Paquete. En el campo Nombre, introduzca ZCL_##_SOLUTION, donde ## representa su número de grupo.

    4. Seleccione Siguiente.

    5. Confirme la orden de transporte y seleccione Finalizar.

  2. Active la copia.

    1. Pulse Ctrl + F3 para activar la clase.

Tarea 2: Definir la interfaz

Defina una interfaz local (nombre sugerido: LIF_OUTPUT) e impleméntela en las clases locales LCL_FLIGHT y LCL_CARRIER.

Nota

Deje la interfaz vacía por ahora. Añadiremos componentes de interfaz en la siguiente tarea.

Pasos

  1. En su clase global, navegue hasta la definición de la clase local LCL_FLIGHT.

    1. Por ejemplo, seleccione el nombre de clase en la vista Resumen.

  2. En la sección pública, añada una sentencia que declare la implementación de la interfaz aún no existente LIF_OUTPUT.

    1. Ajuste el código de la siguiente manera:

      ABAP
      1234
      CLASS lcl_flight DEFINITION ABSTRACT. PUBLIC SECTION. INTERFACES lif_output.
  3. Utilice una corrección rápida para crear la interfaz LIF_OUTPUT como interfaz local.

    1. En la sentencia INTERFACES, sitúe el cursor en lif_output y pulse Ctrl + 1 para invocar las correcciones rápidas disponibles.

    2. En la lista de correcciones rápidas disponibles, seleccione Crear interfaz local lif_output.

      Resultado

      La corrección rápida genera el siguiente código:
      ABAP
      123
      INTERFACE lif_output. ENDINTERFACE.
  4. Implemente la nueva interfaz también en la clase local LCL_CARRIER.

    1. Navegue hasta la definición de la clase local LCL_CARRIER.

    2. Añada el siguiente código debajo de la sentencia PUBLIC SECTION:

      ABAP
      1
      INTERFACES lif_output.

Tarea 3: Implementar métodos de interfaz

Mueva la definición del método de instancia GET_OUTPUT de la clase LCL_CARRIER a la interfaz LIF_OUTPUT. A continuación, implemente la interfaz en la clase local LCL_FLIGHT, donde delegue la solicitud al método GET_DESCRIPTION.

Pasos

  1. Utilice una corrección rápida para mover el método (pull-up) GET_OUTPUT de la clase local LCL_CARRIER a la interfaz local LIF_OUTPUT.

    Nota

    Ignore el mensaje de advertencia de que el método hace referencia a otros componentes de la clase.
    1. En la clase local LCL_CARRIER, navegue hasta la definición del método de instancia GET_OUTPUT.

    2. En la sentencia METHODS, sitúe el cursor en get_output y pulse Ctrl + 1 para invocar las correcciones rápidas disponibles.

    3. En la lista de correcciones rápidas disponibles, seleccione Pull-Up get_output to interface lif_output.

    4. Lea la advertencia detenidamente y, a continuación, seleccione Continuar.

    Resultado

    La corrección rápida borra la definición del método GET_OUTPUT de la clase LCL_CARRIER y añade el método a la interfaz:
    ABAP
    1234
    INTERFACE lif_output. METHODS get_output RETURNING VALUE(r_result) TYPE tt_output. ENDINTERFACE.
    Además, el nombre del método en la parte de implementación de la clase LCL_CARRIER se adapta al nombre completamente cualificado del método de interfaz:
    ABAP
    123456
    METHOD lif_output~get_output. APPEND |{ 'Carrier Name:'(001) } { me->name }| TO r_result. APPEND |{ 'Passenger Flights:'(002) } { pf_count }| TO r_result. APPEND |{ 'Average free seats:'(003) } { get_average_free_seats( ) }| TO r_result. APPEND |{ 'Cargo Flights:'(004) } { cf_count }| TO r_result. ENDMETHOD.
    Finalmente, la corrección rápida crea el alias get_output para el método de interfaz lif_output~get_output en la sección pública de la clase LCL_CARRIER:
    ABAP
    1
    ALIASES: get_output FOR lif_output~get_output.
  2. Analice el nuevo error de sintaxis en la vista Problemas.

    1. Abra la vista Problemas, que se encuentra debajo del editor.

  3. Utilice la ayuda rápida para mover (pull-up) los tipos TT_OUTPUT y T_OUTPUT de la clase local LCL_CARRIER a la interfaz LIF_OUTPUT.

    1. En la clase local LCL_CARRIER, navegue hasta la definición del tipo TT_OUTPUT.

    2. En la sentencia TYPES, sitúe el cursor en tt_output y pulse Ctrl + 1 para invocar las correcciones rápidas disponibles.

    3. En la lista de correcciones rápidas disponibles, seleccione Pull-Up tt_output a la interfaz lif_output.

    4. Seleccione Continuar para ignorar la advertencia relacionada con el tipo T_OUTPUT.

    5. Repita los pasos anteriores para arrastrar el tipo T_OUTPUT a la interfaz.

  4. Si es necesario, ajuste la secuencia del tipo TT_OUTPUT y T_OUTPUT en la definición de interfaz.

    1. La definición de interfaz debería tener el siguiente aspecto:

      ABAP
      12345678
      INTERFACE lif_output. TYPES t_output TYPE string. TYPES tt_output TYPE STANDARD TABLE OF t_output WITH NON-UNIQUE DEFAULT KEY. METHODS get_output RETURNING VALUE(r_result) TYPE tt_output. ENDINTERFACE.
  5. Utilice una corrección rápida para añadir la implementación que falta del método de interfaz GET_OUTPUT en la clase local LCL_FLIGHT.

    1. Vaya a la definición de la clase local LCL_FLIGHT.

    2. En la sentencia INTERFACES, sitúe el cursor en lif_output y pulse Ctrl + 1. Como alternativa, seleccione el icono de error con la bombilla en la parte izquierda de la fila de código.

    3. En la lista de correcciones rápidas, seleccione Añadir implementación para get_output.

  6. En el método añadido lif_output~get_output, implemente una llamada del método de instancia get_description y almacene el resultado en el parámetro de retorno r_result.

    1. Ajuste el código de la siguiente manera:

      ABAP
      123
      METHOD lif_output~get_output. r_result = get_description( ). ENDMETHOD.
  7. Active y pruebe su clase global como aplicación de consola.

    1. Pulse Ctrl + F3.

    2. Pulse F9.