Analyse et test du code
Utilisation correcte des types de données et des conversions de types
Traitement des zones de caractères
Utilisation du Pushdown de code dans ABAP SQL
Amélioration de la performance des tables internes
Implémentation des contrôles des autorisations
Conception d'un code orienté objet efficace
Définition et utilisation des classes d'exception
Ajout de documentation au code ABAP

Définition d'interfaces

Objective

After completing this lesson, you will be able to définissez des interfaces.

Définition d'interface

Motifs d'utilisation des interfaces

Les interfaces vous permettent de définir comment un programme s'adressera à une ou plusieurs classes. Dans une interface, vous pouvez définir des méthodes, des attributs, des types et des constantes, comme vous le feriez dans une classe. Ces composants forment une description de la manière dont un programme client peut interagir avec les objets correspondants. Cependant, une interface ne peut pas être instanciée et ne contient aucune implémentation de ses méthodes. Pour que le concept fonctionne, nous avons également besoin d'une ou plusieurs classes qui implémentent l'interface. Cela signifie qu'ils incluent l'interface dans leur propre déclaration de classe et que les composants déclarés dans l'interface font partie de la classe elle-même. Si l'interface contient des déclarations de méthode, la classe qui implémente l'interface doit également fournir une implémentation de ces méthodes.

Les interfaces ont deux utilisations importantes :

Fournir une approche unifiée à différentes classes : si vous avez des classes qui ne sont pas liées par héritage, mais qui doivent toujours fournir des services communs à leurs utilisateurs, vous pouvez définir les services communs dans une interface. Cela garantit que chaque classe fournit une méthode avec le même nom et la même signature pour effectuer une tâche particulière. Les programmes qui utilisent les classes ont alors un seul moyen d'appeler des fonctions particulières quelle que soit la classe qu'ils adressent réellement.

Approche simplifiée d'une classe complexe : comme vous le verrez plus loin, les interfaces fournissent une vue restreinte d'un objet. Cela vous permet d'exposer un ensemble particulier de méthodes à un programme qui utilisera une classe particulière sur la base des fonctions dont le programme a réellement besoin.

Regardez cet exemple pour savoir comment fonctionne une interface.

Définition d'interface

La définition d'une interface est très similaire à la section de définition d'une classe. Cependant, comme une interface n'a pas d'implémentation, il n'y a pas d'option DEFINITION dans l'instruction INTERFACE. La deuxième différence majeure est qu'il n'y a pas de sections de visibilité dans une interface, car tous les composants d'une interface sont publics. Les interfaces sont utiles en raison de leur interaction avec d'autres classes, donc avoir des composants non publics n'aurait aucun sens.

Dans la définition d'interface, vous pouvez utiliser des types, des attributs, des constantes et des méthodes, et les composantes d'instance et statiques sont autorisées. N'oubliez pas que les méthodes d'interface ont une définition, mais pas d'implémentation. Elle sera fournie par la classe d'implémentation.

À bien des égards, les interfaces sont similaires aux superclasses abstraites. Ils fournissent une technique utile pour les cas dans lesquels vous devez définir des membres communs pour les classes sans qu'il y ait de cas d'héritage, en d'autres termes, il n'y a pas de relation "est une" claire.

Implémentation de l'interface

Pour implémenter une interface dans une classe, vous utilisez l'instruction INTERFACES. Comme tous les composants de l'interface sont publics et que vous ne pouvez pas modifier la visibilité d'un composant existant, vous devez inclure l'interface dans la section publique de la classe.

Dès que vous avez écrit l'instruction INTERFACES, votre programme est syntaxiquement incorrect. En effet, l'interface contient une méthode que vous n'avez pas encore implémentée. Vous pouvez utiliser un correctif rapide (Ctrl + 1) pour ajouter l'implémentation de méthode à votre classe.

Lorsque vous déclarez une interface dans une classe, vous devez implémenter toutes ses méthodes.

Dans l'implémentation de votre classe, vous devez implémenter toutes les méthodes déclarées dans l'interface. Lorsque vous nommez la méthode dans l'implémentation, vous devez utiliser le nom complet, qui se compose du nom de l'interface et du nom de la méthode joints par un tilde. En effet, il n'y a aucune garantie que le nom de la méthode lui-même est sans ambiguïté ; n'oubliez pas que les noms de composants ne doivent être uniques que dans la classe ou l'interface dans laquelle ils sont déclarés. Par conséquent, une classe peut déclarer une méthode appelée get_partner_Attributes ainsi que l'interface lif_partner.

Essayer : définition d'interface

  1. Créez une nouvelle classe qui implémente l'interface IF_OO_ADT_CLASSRUN.
  2. Passez à l'onglet Types locaux et copiez l'extrait de code suivant dans l'éditeur :
    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. Appuyez sur Ctrl + F3 pour activer la classe.
  4. Familiarisez-vous avec le code.

    Remarque

    Il n'y a pas de code exécutable dans cet exemple.

Définir et implémenter une interface

Vous réalisez que la méthode GET_OUTPUT dans la classe locale LCL_CARRIER et la méthode GET_DESCRIPTION dans la classe locale LCL_FLIGHT sont très similaires. Pour harmoniser la définition, vous introduisez une interface et vous l'implémentez dans les deux classes.

Modèle :

  • /LRN/CL_S4D401_OOS_INH_USAGE (classe globale)

Solution :

  • /LRN/CL_S4D401_OOS_INTERFACE (classe globale)

Tâche 1: Copier modèle (facultatif)

Copiez la classe de modèle /LRN/CL_S4D401_OOS_INH_USAGE. Si vous avez terminé l'exercice précédent, vous pouvez ignorer cette tâche et continuer à modifier votre classe ZCL_##_SOLUTION.

Étapes

  1. Copiez la classe /LRN/CL_S4D401_OOS_INH_USAGE dans une classe de votre propre package (nom proposé : ZCL_##_SOLUTION, ## correspondant à votre numéro de groupe).

    1. Dans l'explorateur de projets, cliquez avec le bouton droit de la souris sur la classe /LRN/CL_S4D401_OOS_INH_USAGE pour ouvrir le menu contextuel.

    2. Dans le menu contextuel, sélectionnez Dupliquer....

    3. Saisissez le nom de votre package dans la zone Package. Dans la zone Nom, saisissez ZCL_##_SOLUTION, où ## représente votre numéro de groupe.

    4. Cliquez sur Next.

    5. Confirmez l'ordre de transport et cliquez sur Terminer.

  2. Activez la copie.

    1. Appuyez sur Ctrl + F3 pour activer la classe.

Tâche 2: Définir l'interface

Définissez une interface locale (nom proposé : LIF_OUTPUT) et implémentez-la dans les classes locales LCL_FLIGHT et LCL_CARRIER.

Remarque

Laissez l'interface vide pour le moment. Nous ajouterons des composants d'interface dans la prochaine tâche.

Étapes

  1. Dans votre classe globale, naviguez jusqu'à la définition de la classe locale LCL_FLIGHT.

    1. Par exemple, sélectionnez le nom de la classe dans la vue Structure.

  2. Dans la section publique, ajoutez une instruction qui déclare l'implémentation de l'interface LIF_OUTPUT qui n'existe pas encore.

    1. Adaptez le code comme suit :

      ABAP
      1234
      CLASS lcl_flight DEFINITION ABSTRACT. PUBLIC SECTION. INTERFACES lif_output.
  3. Utilisez un correctif rapide pour créer l'interface LIF_OUTPUT comme interface locale.

    1. Dans l'instruction INTERFACES, placez le curseur sur lif_output et appuyez sur Ctrl + 1 pour appeler les solutions rapides disponibles.

    2. Dans la liste des solutions rapides disponibles, sélectionnez Créer interface locale lif_output.

      Résultat

      Le correctif rapide génère le code suivant :
      ABAP
      123
      INTERFACE lif_output. ENDINTERFACE.
  4. Implémentez également la nouvelle interface dans la classe locale LCL_CARRIER.

    1. Naviguez vers la définition de la classe locale LCL_CARRIER.

    2. Ajoutez le code suivant sous l'instruction PUBLIC SECTION :

      ABAP
      1
      INTERFACES lif_output.

Tâche 3: Implémenter méthodes d'interface

Déplacez la définition de la méthode d'instance GET_OUTPUT de la classe LCL_CARRIER vers l'interface LIF_OUTPUT. Implémentez ensuite l'interface dans la classe locale LCL_FLIGHT, où vous déléguez la demande à la méthode GET_DESCRIPTION.

Étapes

  1. Utilisez un correctif rapide pour déplacer la méthode (pull up) GET_OUTPUT de la classe locale LCL_CARRIER vers l'interface locale LIF_OUTPUT.

    Remarque

    Ignorez l'avertissement indiquant que la méthode fait référence à d'autres membres de la classe.
    1. Dans la classe locale LCL_CARRIER, naviguez vers la définition de la méthode d'instance GET_OUTPUT.

    2. Dans l'instruction METHODS, placez le curseur sur get_output et appuyez sur Ctrl + 1 pour appeler les solutions rapides disponibles.

    3. Dans la liste des solutions rapides disponibles, sélectionnez Pull-Up get_output pour l'interface lif_output.

    4. Lisez attentivement l'avertissement, puis sélectionnez Poursuivre.

    Résultat

    Le quickfix supprime la définition de la méthode GET_OUTPUT de la classe LCL_CARRIER et ajoute la méthode à l'interface :
    ABAP
    1234
    INTERFACE lif_output. METHODS get_output RETURNING VALUE(r_result) TYPE tt_output. ENDINTERFACE.
    De plus, le nom de la méthode dans la partie implémentation de la classe LCL_CARRIER est adapté au nom complet de la méthode d'interface :
    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.
    Enfin, le correctif rapide crée l'alias get_output pour la méthode d'interface lif_output~get_output dans la section publique de la classe LCL_CARRIER :
    ABAP
    1
    ALIASES: get_output FOR lif_output~get_output.
  2. Analysez la nouvelle erreur de syntaxe dans la vue Problèmes.

    1. Ouvrez la vue Problèmes située sous l'éditeur.

  3. Utilisez l'aide rapide pour déplacer (pull up) les types TT_OUTPUT et T_OUTPUT de la classe locale LCL_CARRIER vers l'interface LIF_OUTPUT.

    1. Dans la classe locale LCL_CARRIER, naviguez jusqu'à la définition du type TT_OUTPUT.

    2. Dans l'instruction TYPES, placez le curseur sur tt_output et appuyez sur Ctrl + 1 pour appeler les solutions rapides disponibles.

    3. Dans la liste des solutions rapides disponibles, sélectionnez Pull-Up tt_output pour l'interface lif_output.

    4. Sélectionnez Poursuivre pour ignorer l'avertissement lié au type T_OUTPUT.

    5. Répétez les étapes précédentes pour extraire le type T_OUTPUT vers l'interface.

  4. Si nécessaire, adaptez la séquence de type TT_OUTPUT et T_OUTPUT dans la définition d'interface.

    1. La définition d'interface doit ressembler à ceci :

      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. Utilisez un quickfix pour ajouter l'implémentation manquante de la méthode d'interface GET_OUTPUT dans la classe locale LCL_FLIGHT.

    1. Naviguez vers la définition de la classe locale LCL_FLIGHT.

    2. Dans l'instruction INTERFACES, placez le curseur sur lif_output et appuyez sur Ctrl + 1. Vous pouvez également cliquer sur l'icône d'erreur avec l'ampoule à gauche de la ligne de code.

    3. Dans la liste des solutions rapides, sélectionnez Ajouter implémentation pour get_output.

  6. Dans la méthode ajoutée lif_output~get_output, implémentez un appel de la méthode d'instance get_description et archivez le résultat dans le paramètre de retour r_result.

    1. Adaptez le code comme suit :

      ABAP
      123
      METHOD lif_output~get_output. r_result = get_description( ). ENDMETHOD.
  7. Activez et testez votre classe globale comme application de console.

    1. Appuyez sur Ctrl + F3.

    2. Appuyez sur F9.