一般的なクラスやより専門的なクラスのコンセプトを理解するには、このビデオを視聴してください。
継承 - "A" 関係
モデリングでは、特化について説明しました。プログラミング言語でこの関係を実装するとき、継承の概念が使用されます。継承では新しいクラス (サブクラス) が既存のクラス (スーパークラス) から派生します。2 つのクラス間に真の継承関係があるかどうかを確認するための信頼できるテストは、"サブクラスはスーパークラス" と言おうとすることです。これが明らかに真である場合、継承関係があります。明らかに真でないか、ちょっと奇妙に聞こえる場合は、継承関係を持たず、それを実装すべきではありません。そうすると、さらに下位の問題が発生する可能性があるためです。模型を試す際、「貨物機は飛行機」「旅客機は飛行機」と断言できる。

スーパークラスから継承するクラスには、スーパークラスのすべてのコンポーネントが自動的に含まれます。そのため、たとえば、旅客機クラスには、航空機と同様に製造業者とタイプがあります。旅客機は飛行機であるため、これは驚くべきではありません。最初にサプリングに見える可能性があるのは、旅客機クラスが独自のメーカーやタイプにアクセスできないことだ。これはスーパークラスのプライベート属性であるためであり、その理由から、サブクラスからはアクセスできません。サブクラスを完全にパブリックにすることなくスーパークラスのコンポーネントにアクセスできるようにする方法を、後に学習します。
継承関係の定義
ABAP では、クラス定義命令で INHERITING FROM オプションを使用して継承を実装します。この例では、旅客機クラスは航空機クラスのサブクラスとして定義されています。サブクラスはそのスーパークラスを認識していますが、航空機クラスにはサブクラスがあるかどうか (存在する場合) がわからないことに注意してください。

サブクラスには、直接のスーパークラスが 1 つしか存在しません。
1 つのスーパークラス - 任意の数のサブクラス
航空機クラスには任意の数のサブクラスがある場合がありますが、どのサブクラスも認識されません。

各サブクラスには直接のスーパークラスが 1 つずつあります。スーパークラスは把握していますが、兄弟クラス (同じスーパークラスから派生した他のクラス) はどれも把握していません。この例では、旅客機クラスに貨物機クラスに関する知識がありません。
サブクラスの拡張方法

サブクラスを宣言したら、そのサブクラスに新しいコンポーネントを追加するか、既存のコンポーネントを変更する必要があります。これは、単なる飛行機クラスのコピーを旅客機または貨物機に変えるものである。継承により、クラスを最初から実装する必要はありません。必要な新しいコンポーネントによってクラスを拡張するだけです。
以下の 3 つの方法を使用することができます。
新しいコンポーネントの追加: クラスで新しい属性、型、定数、およびメソッドを宣言できます。スーパークラスのコンポーネントの宣言にすでに使用されている他の名称と衝突しないようにする必要があります。また、新しいコンポーネントがスーパークラスの特化されたすべてのクラスではなく、サブクラスにのみ関連するようにしてください。汎用的に関連する新しい属性またはメソッドを宣言する場合は、それをスーパークラスに移動させる必要があります。
メソッドの再定義: 継承されたメソッドを呼び出すと、実行システムによってスーパークラスからメソッドの実装が実行されます。ただし、この実装ではサブクラスで宣言した新しいコンポーネントが考慮されません。この場合、メソッドを再定義することができます。つまり、サブクラスに関連する新規実装をメソッドに割り当てることができます。
新しいコンストラクタを追加します。コンストラクタによって、クラスの新しいインスタンスが正しく初期化されます。サブクラスのインスタンスを登録すると、実行システムでは常にスーパークラスのコンストラクタが実行されます。これにより、たとえば、旅客機には他の航空機とまったく同じ方法で製造業者とタイプが含まれるようになります。ただし、スーパークラスのコンストラクタはサブクラスが存在することを認識しないため、サブクラスの属性を初期化できません。このため、サブクラスに対する新しいコンストラクタを定義することができます。
新規コンポーネントの宣言

新しいコンポーネントを宣言することにより、サブクラスを拡張できます。これらは、クラス自体には表示されますが、スーパークラスには表示されず、同じスーパークラスから継承される他のクラスにも表示されません。したがって、新しいコンポーネントを現在のクラスのみに関連付けるか、スーパークラスに宣言する必要があるかを考慮する必要があります。
プロテクトコンポーネント
サブクラスにはスーパークラスの属性がすべて含まれていますが、サブクラス自体がプライベートコンポーネントに直接アクセスすることはできません。スーパークラスの特定の属性またはメソッドを完全にパブリックにすることなく、サブクラスからアクセスできるようにする必要がある場合があります。これは、保護されたセクションで宣言することで実現できます。プロテクトコンポーネントはクラス自体の中だけでなく、すべてのサブクラスから可視です。

クラス定義で、PROTECTED SECTION 命令を使用して、プロテクトセクションを導入します。可視性セクションは常に PUBLIC SECTION - PROTECTED SECTION - PRIVATE SECTION の順で宣言する必要があります。
クイックフィックスを使用して、クラスの既存のコンポーネントを移動することができます。これを行うには、ADT のコンポーネント名にカーソルを合わせ、Ctrl + 1 を押してから、クイックフィックス Make <element> protected を選択します。
保護されたセクションへのプライベートコンポーネントの移動は、互換性のある変更です。コンポーネントの可視性が拡大されました。しかし、パブリックコンポーネントをプロテクトすることは互換性のない変更であり、構文エラーが発生する可能性があります。その理由は、すでに継承階層の外で使用されている可能性があるコンポーネントの可視性を制限したためです。
メソッドの再定義
スーパークラスにサブクラス内で使用したいメソッドが含まれていることがよくありますが、サブクラスの特定の性質が考慮されていないため、メソッドの実装が不適切です。たとえば、航空機クラスの get_attributes メソッドは、旅客機クラスで定義された属性を返すことができません。ただし、旅客機クラスには引き続きメソッド get_attributes が必要です。

ABAP では、インスタンスメソッド get_attributes を再定義することで、この問題を解決することができます。メソッドを再定義する場合、サブクラスのみが把握していることを考慮に入れた新しい実装をサブクラス内に記述します。ただし、メソッドの定義はまったく同じままです。以下のルールに従う必要があります。
- メソッドは同じ名称を維持します。
- REDEFINITION オプションを使用して、サブクラスで宣言し、メソッドを再定義することを示します。
- メソッドの可視性はスーパークラスもあるときと同じになります。
- メソッドの署名は変更できません。
静的メソッドは再定義できません。
再定義の実装
メソッドの再定義を実装すると、実装をスーパークラスで呼び出すことができます。これを行うには、現在のインスタンス内のスーパークラスを指す暗黙的なオブジェクト参照 super を使用します。このようにして、スーパークラスからのメソッド実装を再利用し、それを独自の実装に追加することができます。

参照変数 super を宣言する必要はありません。それは再定義したメソッドの実装内で自動的に使用可能になります。
このようにスーパークラスでメソッドを呼び出す方法はオプションです。これが良い考えである場合もありますが、利点が何も得られない場合もあります。
新規コンストラクタ定義

サブクラスでは、新しいコンストラクタを定義することができます。メソッドの再定義とは異なり、コンストラクタには独自の署名がある場合があります。コンストラクタの署名には、スーパークラスのコンストラクタと同じパラメータに加え、独自の新しいパラメータが含まれることがあります。これは、新しいインスタンスコンストラクタに 2 つのタスクがあるためです。最初にスーパークラスのコンストラクタを呼び出し、次にサブクラスに固有の独自の属性の初期化を処理します。
新しいコンストラクタを定義するのに加えて、サブクラス内に新しい静的コンストラクタを定義することもできます。
コンストラクタのロール
サブクラスのコンストラクタには 2 つの機能があります。スーパークラスのコンポーネントが適切に初期化されていることを確認する必要があり、その後、サブクラス属性の初期値を設定することができます。

この例では、旅客機は航空機であるため、航空機クラスのコンストラクタが正常に動作して新しい旅客機の製造業者とタイプを設定しない限り、旅客機インスタンスは存在しません。この後にのみ、旅客機クラスで独自の属性を設定することができます。
したがって、サブクラスのコンストラクタは独自の属性を設定できるだけでなく、必要な値をスーパークラスのコンストラクタに渡すことも可能である必要があります。そのため、サブクラスのコンストラクタの署名には多くの場合、呼び出す必要があるコンストラクタの全署名が含まれています。
新規コンストラクタ実装の順序

新しいコンストラクタの実装では、特定の操作順序に従う必要があります。最も重要なイベントは、スーパークラスのコンストラクタを呼び出すことです。この処理は必須であり、再定義されたメソッドの元の実装を呼び出すときと同様に、暗黙的な参照の super を使用してメソッドを呼び出します。再度、super を明示的に宣言する必要はありません。
スーパークラスのコンストラクタを呼び出す前に、構築中のインスタンスのインスタンスコンポーネントをアドレスすることはできません。クラスの静的コンポーネントをアドレスし、コンストラクタのインポートパラメータが正しいことをチェックできます。正しくない場合は、例外を発生させます。
スーパークラスのコンストラクタが正常に実行されたら、新しいインスタンスのインスタンスコンポーネントをアドレスすることができます。
コンストラクタ呼出の順序
この図は静的コンストラクタおよびインスタンスコンストラクタの呼出順序を示します。この例では、プログラムが旅客機クラスをインスタンス化する必要があり、その航空機クラスが以前にアドレス指定されていないことを前提としています。

プログラムが旅客機クラスのインスタンスを登録しようとすると、実行システムによって自動的に静的コンストラクタが継承階層の最上部から順次呼び出されます。静的コンストラクタがすべて実行されると、実行システムはサブクラスのインスタンスコンストラクタを呼び出し、次にそれがスーパークラスのインスタンスコンストラクタを呼び出します。



