!--a11y-->
クラスはオブジェクトのテンプレートです。理論的には、特定のクラスに対して任意の数のオブジェクトを生成することができます。プログラミングの観点から見ると、クラスとはソースコードの再利用可能なブロックであり、実行時オブジェクトをメモリ内に生成するときに使用します。このように、クラスとそのオブジェクトとの関係は、メインプログラム(およびそのサブルーチン)のソースコードと、メモリ内にロードされるプログラムバージョンとの関係と同じです。しかし、クラス、メインプログラム、サブルーチンが完全に対応するわけではありません。
ローカルクラスとグローバルクラス
ABAP
オブジェクトには、ローカルクラスとグローバルクラスの区別があります。ローカルクラスのソースコードは、 ABAP エディタで生成される ABAP プログラムの一部です。ローカルクラスは自らが定義されているプログラムのみでから見ることができ、それに対するオブジェクトはそのプログラムの内部でしか登録することができません。グローバルクラスのソースコードはクラスビルダを使って記述し、システム全体のクラスライブラリに格納されます。 ABAP プログラムはどのグローバルクラスに対してもオブジェクトを生成することができます。 ABAP プログラムでクラスを使用すると、指定された名称のローカルクラスが最初に検索されます。それが見つからないときは、グローバルクラスが検索されます。実行時には、オブジェクトがローカルクラスから生成されたものも、グローバルクラスから生成されたものも違いはありません。クラスが自身のソースコードか、
R/3 リポジトリのどちらで定義されているかにかかわらず、 ABAP プログラムは同じようにオブジェクトをメモリ領域で使用します。その唯一の例外は、グローバルクラスのオブジェクトがユーザのグローバルオブジェクトにアクセスできるのに対し、ローカルクラスのオブジェクトにはそれができないことです。ただし、ローカルクラスとグローバルクラスの管理方法は大きく異なります。1つのプログラム内だけで使用されるローカルクラスを定義する場合、通常はそのプログラムに収まるように外側から見えるデータを定義するだけで十分です。これに対して、グローバルクラスはどこでも使用できなければなりません。つまり、グローバルクラスのインタフェースを定義するときは、一定の制限が適用されます。それはグローバルクラスのオブジェクトを使用するプログラムが各インタフェースパラメータのデータ型を認識できるようにしなければならないためです。
クラスの定義
クラスは
ABAP 命令 CLASS ... ENDCLASS. ローカルクラスの場合、このソースコードは該当する ABAP プログラムに直接入力します。グローバルクラスの場合は、ソースコードは R/3 リポジトリ内の特別なテーブルでクラスビルダによって生成されます。完全なクラス定義は宣言部、および必要な場合は導入部で構成されます。クラス
<class> の宣言部は命令ブロックです。CLASS <class> DEFINITION.
...
ENDCLASS.
これにはすべての クラスコンポーネント(属性、メソッド、イベント)の宣言が含まれています。ローカルクラスを定義する場合、宣言部はグローバルプログラムデータに属します。したがって、宣言部はプログラムの先頭に入れる必要があります。
メソッドをクラスの宣言部で宣言するときは、それに対する導入部も記述しなければなりません。これは追加の命令ブロックを構成します。
CLASS <class> IMPLEMENTATION.
...
ENDCLASS.
クラスの導入部には、そのクラスのすべての メソッドの導入が含まれます。ローカルクラスの導入部は処理ブロックです。したがって、それ自身が処理ブロックではない、それ以降のコードはアクセスすることができません。
可視セクション
クラスの宣言部は最高で3つの可視性領域に分けることができます。
CLASS <class> DEFINITION.
PUBLIC SECTION.
...
PROTECTED SECTION.
...
PRIVATE SECTION.
...
ENDCLASS.
これらのセクションは クラスコンポーネントの可視性を定義します。
PUBLIC
PROTECTED
クラスの
PRIVATE セクションで宣言されるコンポーネントは、そのクラス自身のメソッドからのみ見ることができます。可視性セクションを使用することで、
ABAP オブジェクトにカプセル化の重要な特性が与えられます。クラスを定義する場合、パブリックコンポーネントの設計には格別な注意を払う必要があり、できるだけ宣言するパブリックコンポーネントの数を少なくするようにすべきです。クラスのパブリックコンポーネントは、オブジェクトとそのユーザとの間のインタフェースとなります。そのため、一度クラスをリリースすると、あとで変更するべきではありません。クラスコンポーネント
クラスのコンポーネントはクラスの内容を構成します。クラスコンポーネントは、クラスから生成されるオブジェクトの個別部分です。クラスコンポーネントは、オブジェクトの機能を決定するビルディングブロックです。すべてのクラスコンポーネントは同じ名称領域に属するものでなければならず、すべてを3つの 可視性セクションのどれかに割り当てなければなりません。
データ型
クラスでは(グローバルクラスのパブリックセクションを除き)、
TYPES 命令を使用して内部データ型を登録することができます。グローバルクラスのパブリックセクションに適用されるもう1つの制限は、 DATA 命令やメソッドインタフェースの定義でデータ型を(たとえば、長さとオフセット、または小数点以下桁数の指定により)暗黙的に宣言することができない点です。グローバルクラスのパブリックセクションの内部では、 ABAP ディクショナリのシステム全体のディクショナリ型のみが参照できます。属性
属性にはオブジェクトの実データが含まれます。属性は
DATA 命令を使ってクラスの定義部の任意の可視性セクションで宣言することができます。プログラミングの観点から見ると、クラス内の属性はプログラム内のグローバルデータに相当します。クラスのすべての属性はメソッドやサブルーチンのローカル属性によって隠されない限り、クラスのなかで見えます。可視性セクションは属性の対外的な可視性を定義します。クラスの外部から一般に見えるのはパブリック属性だけです。パブリック属性は、オブジェクトとそのユーザとの間のインタフェースとなります。しかし、パブリック属性の使用は例外に限る必要があります。オブジェクト指向プログラミングでは、オブジェクトのデータ内容をできるだけカプセル化して、メソッドのみからアクセスできるようにすべきです。そのため、ほとんどの場合、クラスの外部からは見えない私用属性を使用します。
メソッド
メソッドはオブジェクトと関連付けられた機能を提供します。メソッドはクラスの属性すべてにアクセスすることができます。そのため、メソッドはオブジェクトのデータ内容を変更することができます。メソッドにはインタフェースパラメータもあるので、ユーザはメソッドを呼び出すときにメソッドに値を渡し、メソッドから値を戻すことができます。クラスのメソッドはクラス内部で汎用にアドレスすることができます。メソッドを外部からアドレスできるかどうかは、どの可視性セクションで定義されているかに依存します。
オブジェクト指向プログラミングでは、パブリックメソッドとそのパラメータがオブジェクトとユーザの主なインタフェースです。パブリック属性を使用しない場合、パブリックメソッドのインタフェースパラメータがオブジェクトのデータインタフェースとなります。
メソッドは
METHODS 命令を使ってクラスの定義部の任意の可視性セクションで宣言することができます。 METHODS 命令にはインタフェースパラメータも定義します。クラスの導入部でメソッドの実際の機能をプログラムするには、 METHOD 命令で始まり、 ENDMETHOD 命令で終わる処理ブロックを使用します。メソッドを呼び出すときは、 CALL METHOD 命令を使用します。メソッドにおけるローカルデータ型とオブジェクトの宣言は、他の
ABAP ルーチン(サブルーチンと汎用モジュール)の場合と同じ方法で行うことができます。ローカルデータの名前がクラス属性と同じときは、クラス属性にメソッド内からアクセスすることはできません。しかし、それでも ME -> 参照を使用することでクラス属性にアクセスすることができます。イベント
オブジェクトはイベントを開始し、イベントハンドラメソッドを呼び出すことができます。メソッドの場合と同じように、イベントにはインタフェースパラメータがあり、すべてのクラスコンポーネントと同様に、通常の可視性規則の対象となります。
イベントは
EVENTS 命令を使用してクラスの定義部で定義します。 EVENTS 命令はインタフェースパラメータを定義するときにも使用します。同じクラスまたは下位クラスのメソッドは、 RAISE EVENTS 命令を使ってイベントを開始することができます。同一または異なるクラスのメソッドをイベントハンドラメソッドとして登録することができます。イベントハンドラメソッドのインタフェースは EVENTS 命令によって決定されます。実行時には、1つのオブジェクトのイベントハンドラメソッドを他のオブジェクトのイベントのハンドラとして登録することができます。イベントが開始されると、イベントハンドラメソッドは登録されたオブジェクトで呼び出されます。
イベントの開始と処理も参照してください。静的属性、静的メソッド、静的イベント
従来導入されていたクラスコンポーネントは、オブジェクトのコンポーネントの単なるテンプレートです。つまり、特定のクラスのインスタンスとしてオブジェクトを生成するまではそれを使用できません。そのため、これらのクラスコンポーネントはインスタンス属性、インスタンスメソッド、インスタンスイベントとも呼ばれています。
しかし、
ABAP オブジェクトでは静的な属性、メソッド、イベントも用意しています。これらのクラスコンポーネントはインスタンスに依存せず、各クラスで1回にかぎり存在するものです。これらのクラスコンポーネントはそれが最初にアドレスされた呼出元プログラムのメモリ領域で登録され、プログラムが終了するまでメモリ領域に残ります。クラスコンポーネントはグローバルコンポーネントであり、クラスの全インスタンスが使用することができます。宣言されている可視性セクションによっては、クラスの外部からも見ることができます。静的コンポーネントをクラスの定義部で宣言するときは、
CLASS-DATA 、 CLASS-METHODS 、および CLASS-EVENTS 命令を使用します。静的コンポーネントは、静的属性だけを操作でき、静的イベントだけを開始できる点で限定的なものです。定数
定数は特別な静的属性です。定数の値は定数を宣言するときに設定し、それ以降は変更することができなくなります。定数はインスタンスから独立しています。定数はプログラムのメモリ領域だけに存在します。定数は
CONSTANTS 命令を使用してクラスの定義部で定義します。
次の例はカウンタをプログラミングするために
CLASS C_COUNTER DEFINITION.
PUBLIC SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS C_COUNTER IMPLEMENTATION.
METHOD SET_COUNTER.
METHOD INCREMENT_COUNTER.
METHOD GET_COUNTER.
ENDCLASS.
クラス
C_COUNTER には3つのパブリックメソッド、すなわち SET_COUNTER 、 INCREMENT_COUNTER 、および GET_COUNTER が含まれます。これらのパブリックメソッドは私用整数項目 COUNT を使用します。メソッドのうち2つには、入力パラメータと出力パラメータがあります。これらがクラスのデータインタフェースとなります。項目 COUNT は外部からは見えません。次のセクションの例、
参照変数とオブジェクトインスタンスでは、クラス C_COUNTER のインスタンスを登録する方法を説明します。