ローカルクラス LCL_CARRIER のメソッド GET_OUTPUT とローカルクラス LCL_FLIGHT のメソッド GET_DESCRIPTION は非常に類似していることがわかります。定義を調整するには、インタフェースを導入し、両方のクラスに実装します。
タスク 1: テンプレートのコピー (オプション)
テンプレートクラス /LRN/CL_S4D401_OOS_INH_USAGE をコピーします。前の演習問題を完了した場合は、このタスクをスキップし、クラス ZCL_##_SOLUTION の編集を続行することができます。
ステップ
クラス /LRN/CL_S4D401_OOS_INH_USAGE を独自のパッケージのクラスにコピーします (推奨名: ZCL_##_SOLUTION、## はグループ番号)。
Project Explorer で、クラス /LRN/CL_S4D401_OOS_INH_USAGE を右クリックしてコンテキストメニューを開きます。
コンテキストメニューから Duplicate.... を選択します。
Package 項目にパッケージの名称を入力します。Name 項目に、ZCL_##_SOLUTION (## はグループ番号) と入力します。
Next を選択します。
移送依頼を確認し、Finish を選択します。
コピーを有効化します。
Ctrl + F3 を押してクラスを有効化します。
タスク 2: インタフェースの定義
ローカルインタフェース (推奨名: LIF_OUTPUT) を定義し、ローカルクラス LCL_FLIGHT および LCL_CARRIER に実装します。
注記
現時点では、インタフェースは空白のままにします。インタフェースコンポーネントは次のタスクで追加します。
ステップ
グローバルクラスで、ローカルクラス LCL_FLIGHT の定義にナビゲートします。
たとえば、Outline ビューでクラス名を選択します。
public セクションで、存在しないインタフェース LIF_OUTPUT の実装を宣言する文を追加します。
コードを以下のように調整します。
1234
CLASS lcl_flight DEFINITION ABSTRACT.
PUBLIC SECTION.
INTERFACES lif_output.
クイックフィックスを使用して、インタフェース LIF_OUTPUT をローカルインタフェースとして登録します。
INTERFACES 命令で、lif_output にカーソルを置き、Ctrl + 1 を押して利用可能なクイックフィックスを呼び出します。
利用可能なクイックフィックスの一覧から、Create local interface lif_output を選択します。
結果
クイックフィックスにより、以下のコードが生成されます。
123
INTERFACE lif_output.
ENDINTERFACE.
ローカルクラス LCL_CARRIER にも新規インタフェースを実装します。
ローカルクラス LCL_CARRIER の定義にナビゲートします。
PUBLIC SECTION 命令の下に次のコードを追加します。
タスク 3: インタフェースメソッドの実装
インスタンスメソッド GET_OUTPUT の定義をクラス LCL_CARRIER からインタフェース LIF_OUTPUT に移動します。次に、ローカルクラス LCL_FLIGHT にインタフェースを実装します。ここで、要求をメソッド GET_DESCRIPTION に委任します。
ステップ
クイックフィックスを使用して、メソッド GET_OUTPUT をローカルクラス LCL_CARRIER からローカルインタフェース LIF_OUTPUT に移動します。
注記
メソッドがクラスの他のコンポーネントを参照していることを示す警告は無視してください。
ローカルクラス LCL_CARRIER で、インスタンスメソッド GET_OUTPUT の定義にナビゲートします。
METHODS 命令で、get_output にカーソルを置き、Ctrl + 1 を押して利用可能なクイックフィックスを呼び出します。
利用可能なクイックフィックスの一覧から、Pull-Up get_output to interface lif_output を選択します。
警告をよく読み、続行を選択します。
結果
クイックフィックスにより、クラス
LCL_CARRIER から
GET_OUTPUT メソッドの定義が削除され、メソッドがインタフェースに追加されます。
1234
INTERFACE lif_output.
METHODS get_output
RETURNING VALUE(r_result) TYPE tt_output.
ENDINTERFACE.
さらに、
LCL_CARRIER クラスの実装部分のメソッド名は、インタフェースメソッドの完全修飾名に合わせて調整されます。
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.
最後に、クイックフィックスによって、インタフェースメソッド
lif_output~get_output のエイリアス
get_output がクラス
LCL_CARRIER のパブリックセクションに登録されます。
1
ALIASES: get_output FOR lif_output~get_output.
Problems ビューで新しい構文エラーを分析します。
エディタの下にある Problems ビューを開きます。
クイックアシストを使用して、タイプ TT_OUTPUT および T_OUTPUT をローカルクラス LCL_CARRIER からインタフェース LIF_OUTPUT に移動 (プルアップ) します。
ローカルクラス LCL_CARRIER で、タイプ TT_OUTPUT の定義にナビゲートします。
TYPES 命令で、tt_output にカーソルを置き、Ctrl + 1 を押して利用可能なクイックフィックスを呼び出します。
利用可能なクイックフィックスの一覧から、Pull-Up tt_output to interface lif_output を選択します。
続行を選択して、タイプ T_OUTPUT に関連する警告を無視します。
前のステップを繰り返して、タイプ T_OUTPUT をインタフェースにプルアップします。
必要に応じて、インタフェース定義でタイプ TT_OUTPUT および T_OUTPUT の順序を調整します。
インタフェース定義は以下のようになります。
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.
クイックフィックスを使用して、インタフェースメソッド GET_OUTPUT の欠落している実装をローカルクラス LCL_FLIGHT に追加します。
ローカルクラス LCL_FLIGHT の定義にナビゲートします。
INTERFACES 命令で、lif_output にカーソルを合わせ、Ctrl + 1 を押します。または、コード行の左側にある電球が表示されたエラーアイコンを選択します。
クイックフィックスの一覧から、Add implementation for get_output を選択します。
追加されたメソッド lif_output~get_output で、インスタンスメソッド get_description の呼出を実装し、その結果をリターンパラメータ r_result に格納します。
コードを以下のように調整します。
123
METHOD lif_output~get_output.
r_result = get_description( ).
ENDMETHOD.
グローバルクラスをコンソールアプリとして有効化してテストします。
Ctrl + F3 を押します。
F9 を押します。