Dans l'exercice précédent, vous avez créé une surclasse commune LCL_FLIGHT pour les classes LCL_PASSENGER_FLIGHT et LCL_CARGO_FLIGHT. Vous allez maintenant modifier la classe locale LCL_CARRIER pour utiliser la relation de transmission de données. Vous saisirez les variables de référence utilisées comme paramètres pour le type de la surclasse et, au lieu de deux attributs d'instance distincts passager_flights et cargo_flights, définissez un attribut d'instance unique vols dans lequel vous pouvez stocker les références à toutes les instances de vol, qu'il s'agisse de vols de passagers ou de fret.
Tâche 1: Copier modèle (facultatif)
Copiez la classe de modèle /LRN/CL_S4D401_OOS_INHERITANCE. Si vous avez terminé l'exercice précédent, vous pouvez ignorer cette tâche et continuer à modifier votre classe ZCL_##_SOLUTION.
Étapes
Copiez la classe /LRN/CL_S4D401_OOS_INHERITANCE dans une classe de votre propre package (nom proposé : ZCL_##_SOLUTION, ## correspondant à votre numéro de groupe).
Dans l'explorateur de projets, cliquez avec le bouton droit de la souris sur la classe /LRN/CL_S4D401_OOS_INHERITANCE pour ouvrir le menu contextuel.
Dans le menu contextuel, sélectionnez Dupliquer....
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.
Cliquez sur Next.
Confirmez l'ordre de transport et cliquez sur Terminer.
Activez la copie.
Appuyez sur Ctrl + F3 pour activer la classe.
Tâche 2: Paramètre générique
Dans la classe locale LCL_CARRIER, adaptez les définitions des méthodes FIND_PASSENGER_FLIGHT et FIND_CARGO_FLIGHT. Dans les deux méthodes, saisissez le paramètre d'exportation e_flight comme variable de référence basée sur la classe locale LCL_FLIGHT.
Étapes
Dans la classe locale LCL_CARRIER, ajustez la définition de la méthode FIND_CARGO_FLIGHT. Saisissez le paramètre de retour e_flight avec LCL_FLIGHT au lieu de LCL_CARGO_FLIGHT. Veillez à sauvegarder la modification.
Adaptez le code comme suit :
123456789
METHODS find_cargo_flight
IMPORTING
i_airport_from_id TYPE /dmo/airport_from_id
i_airport_to_id TYPE /dmo/airport_to_id
i_from_date TYPE /dmo/flight_date
i_cargo TYPE /lrn/plane_actual_load
EXPORTING
e_flight TYPE REF TO lcl_flight
e_days_later TYPE i.
Analysez l'utilisation du vol variable local dans l'implémentation de la méthode FIND_CARGO_FLIGHT.
Pour afficher le type de la variable de référence Vol, placez le curseur sur le nom de la variable et appuyez sur F2.
Analysez l'appel de la méthode FIND_CARGO_FLIGHT dans la méthode IF_OO_ADT_CLASSRUN~MAIN de votre classe globale.
Pour afficher le type de la variable de référence cargo_flight, placez le curseur sur le nom de la variable et appuyez sur F2.
Adaptez la définition de la méthode FIND_PASSENGER_FLIGHT de la même manière. Saisissez le paramètre de retour e_flight avec LCL_FLIGHT au lieu de LCL_PASSENGER_FLIGHT.
Adaptez le code comme suit :
123456789
METHODS find_passenger_flight
IMPORTING
i_airport_from_id TYPE /dmo/airport_from_id
i_airport_to_id TYPE /dmo/airport_to_id
i_from_date TYPE /dmo/flight_date
i_seats TYPE i
EXPORTING
e_flight TYPE REF TO lcl_flight
e_days_later TYPE i.
Activez le code pour vérifier que cette modification n'entraîne pas non plus d'erreurs de syntaxe.
Appuyez sur Ctrl + F3 pour activer le code.
Tâche 3: Attribut générique
Dans la classe locale LCL_CARRIER, définissez un attribut d'instance privé vols dans lequel vous pouvez archiver des références aux instances de LCL_PASSENGER_FLIGHT et LCL_CARGO_FLIGHT en même temps. Renseignez l'attribut dans l'implémentation de la méthode CONSTRUCTOR avec le contenu combiné des attributs passager_flights et cargo_flights.
Étapes
Dans la classe locale LCL_FLIGHT, utilisez un quickfix pour générer un type de table publique basé sur cette classe (nom suggéré pour le type de table : tab).
Accédez à la définition de la classe locale LCL_FLIGHT.
Dans l'instruction CLASS, placez le curseur sur lcl_flight et appuyez sur Ctrl + 1 pour appeler les solutions rapides disponibles.
Dans la liste des solutions rapides disponibles, sélectionnez Générer type de table pour lcl_flight.
La nouvelle instruction TYPES doit ressembler à ceci :
1
TYPES tab TYPE STANDARD TABLE OF REF TO lcl_flight WITH DEFAULT KEY.
Dans la section privée de la classe locale LCL_CARRIER, définissez de nouveaux vols d'attributs d'instance. Saisissez-le avec le type de table que vous venez de créer dans la classe locale LCL_FLIGHT.
Adaptez le code comme suit :
1234
DATA passenger_flights TYPE lcl_passenger_flight=>tt_flights.
DATA cargo_flights TYPE lcl_cargo_flight=>tt_flights.
DATA flights TYPE lcl_flight=>tab.
Adaptez l'implémentation de la méthode CONSTRUCTOR de la classe locale LCL_CARRIER. Après avoir appelé la méthode GET_FLIGHTS_BY_CARRIER de LCL_PASSENGER_FLIGHT, ajoutez toutes les références d'objet stockées dans passager_flights aux vols.
Passez à l'implémentation de la méthode CONSTRUCTOR dans la classe locale LCL_CARRIER.
Avant l'instruction ENDMETHOD, ajoutez le code suivant :
123
LOOP AT passenger_flights INTO DATA(passflight).
APPEND passflight TO flights.
ENDLOOP.
Si vous préférez une compréhension de table, ajoutez plutôt le code suivant :
12345
flights = VALUE #( BASE flights
FOR pflight IN passenger_flights (
pflight
)
).
De même, implémentez une boucle sur cargo_flights et ajoutez également ces références aux vols.
Avant l'instruction ENDMETHOD, ajoutez le code suivant :
123
LOOP AT cargo_flights INTO DATA(cargoflight).
APPEND cargoflight TO flights.
ENDLOOP.
Si vous préférez une compréhension de table, ajoutez plutôt le code suivant :
12345
flights = VALUE #( BASE flights
FOR cflight IN cargo_flights (
cflight
)
).
Tâche 4: Accès générique et Down-Cast
Supprimez les attributs d'instance passager_flights et cargo_flights dans la classe locale LCL_CARRIER et remplacez-les par le nouvel attribut vols. Lorsque le code accède à des composants spécifiques des sous-classes, implémentez un transtypage descendant.
Étapes
Dans la partie définition de la classe locale LCL_CARRIER, supprimez ou commentez la définition des attributs passager_flights et cargo_flights.
Sélectionnez les deux instructions DATA et appuyez sur Ctrl + < pour ajouter un signe de commentaire devant chaque ligne de code :
Dans la méthode CONSTRUCTOR, utilisez des déclarations en ligne pour déclarer passager_flights et cargo_flights comme variables locales.
Adaptez le code comme suit :
1234567
DATA(passenger_flights) =
lcl_passenger_flight=>get_flights_by_carrier(
i_carrier_id = i_carrier_id ).
DATA(cargo_flights) =
lcl_cargo_flight=>get_flights_by_carrier(
i_carrier_id = i_carrier_id ).
Après les appels de méthode avec les déclarations en ligne, renseignez un attribut d'instance privé avec le nombre de lignes dans la variable locale passager_flights (nom suggéré : pf_count).
Astuce
Implémentez d'abord la valorisation. Utilisez ensuite un correctif rapide pour créer la déclaration d'attribut.
Adaptez le code comme suit :
12345
DATA(passenger_flights) =
lcl_passenger_flight=>get_flights_by_carrier(
i_carrier_id = i_carrier_id ).
pf_count = lines( passenger_flights ).
Placez le curseur sur pf_count, appuyez sur Ctrl + 1 et sélectionnez Déclarer attribut pf_count.
De même, renseignez un attribut d'instance privé avec le nombre de lignes dans la variable locale cargo_flights (nom suggéré : cf_count).
Adaptez le code comme suit :
12345
DATA(cargo_flights) =
lcl_cargo_flight=>get_flights_by_carrier(
i_carrier_id = i_carrier_id ).
cf_count = lines( cargo_flights ).
Placez le curseur sur cf_count, appuyez sur Ctrl + 1 et sélectionnez Déclarer attribut cf_count.
Dans la méthode GET_OUTPUT, remplacez les fonctions LINES intégrées par les attributs que vous venez de définir.
Adaptez le code comme suit :
123456
METHOD 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.
Dans la méthode FIND_CARGO_FLIGHT, remplacez l'attribut cargo_flights par l'attribut vols.
Adaptez le code comme suit :
12
LOOP AT me->flights INTO DATA(flight)
Dans l'appel de la méthode GET_FREE_CAPACITY, ajoutez une expression CAST.
Adaptez le code comme suit :
1234
IF connection_details-airport_from_id = i_airport_from_id
AND connection_details-airport_to_id = i_airport_to_id
AND CAST lcl_cargo_flight( flight )->get_free_capacity( ) >= i_cargo.
Pour vous assurer de prendre uniquement en compte les instances de LCL_CARGO_FLIGHT, étendez la condition WHERE du LOOP.
Astuce
N'oubliez pas que dans les tables internes avec le type de ligne élémentaire, vous adressez le contenu avec le pseudo-composant table_line.
Adaptez le code comme suit :
123
LOOP AT me->flights INTO DATA(flight)
WHERE table_line->flight_date >= i_from_date
AND table_line IS INSTANCE OF lcl_cargo_flight.
Adaptez l'implémentation de la méthode FIND_PASSENGER_FLIGHT de la même manière.
Adaptez le code comme suit :
12345678910111213141516171819
LOOP AT me->flights INTO DATA(flight)
WHERE table_line->flight_date >= i_from_date
AND table_line IS INSTANCE OF lcl_passenger_flight.
DATA(connection_details) = flight->get_connection_details( ).
IF connection_details-airport_from_id = i_airport_from_id
AND connection_details-airport_to_id = i_airport_to_id
AND CAST lcl_passenger_flight( flight )->get_free_seats( ) >= i_seats.
DATA(days_later) = flight->flight_date - i_from_date.
IF days_later < e_days_later. e_flight = flight.
e_days_later = days_later.
ENDIF.
ENDIF.
ENDLOOP.
Adaptez l'implémentation de la méthode GET_AVERAGE_FREE_SEATS. Utilisez les vols de la table interne dans la réduction de table et ajoutez une expression CAST et une condition WHERE à la réduction. Le nombre requis de vols passagers est stocké dans l'attribut pf_count créé ci-dessus.
Adaptez le code comme suit :
12345678910111213141516
METHOD get_average_free_seats.
r_result = REDUCE #(
INIT i = 0
FOR flight IN flights
WHERE ( table_line IS INSTANCE OF lcl_passenger_flight )
NEXT i += CAST lcl_passenger_flight( flight )->get_free_seats( )
) / pf_count.
ENDMETHOD.
Activez et testez votre classe globale comme application de console.
Appuyez sur Ctrl + F3.
Appuyez sur F9.