Sap-abap-classes

提供:Dev Guides
移動先:案内検索

SAP ABAP-クラス

クラスはオブジェクトの形式を指定するために使用され、データ表現とそのデータを1つのきれいなパッケージに操作するためのメソッドを組み合わせます。 クラス内のデータと関数は、*クラスのメンバー*と呼ばれます。

クラスの定義と実装

クラスを定義するときには、データ型の設計図を定義します。 これは実際にはデータを定義しませんが、クラス名の意味、クラスのオブジェクトの構成要素、およびそのようなオブジェクトに対して実行できる操作を定義します。 つまり、属性、フィールド、プロパティなど、オブジェクトの抽象的な特性を定義します。

次の構文は、クラスを定義する方法を示しています-

CLASS <class_name> DEFINITION.
..........
..........
ENDCLASS.

クラス定義は、キーワードCLASSで始まり、クラス名、DEFINITION、およびクラス本体が続きます。 クラスの定義には、属性、メソッド、イベントなど、クラスのさまざまなコンポーネントを含めることができます。 クラス宣言でメソッドを宣言するとき、メソッド実装をクラス実装に含める必要があります。 次の構文は、クラスを実装する方法を示しています-

CLASS <class_name> IMPLEMENTATION.
...........
..........
ENDCLASS.

-クラスの実装には、そのすべてのメソッドの実装が含まれます。 ABAPオブジェクトでは、クラスの構造には、属性、メソッド、イベント、タイプ、定数などのコンポーネントが含まれます。

属性

属性は、C、I、F、Nなどの任意のデータ型を持つことができるクラスのデータフィールドです。 それらはクラス宣言で宣言されます。 これらの属性は、インスタンス属性と静的属性の2つのカテゴリに分類できます。 *インスタンス属性*は、オブジェクトのインスタンス固有の状態を定義します。 状態はオブジェクトごとに異なります。 インスタンス属性は、DATAステートメントを使用して宣言されます。

  • 静的属性*は、クラスのすべてのインスタンスによって共有されるクラスの共通状態を定義します。 つまり、クラスの1つのオブジェクトの静的属性を変更すると、その変更はクラスの他のすべてのオブジェクトにも表示されます。 静的属性は、CLASS-DATAステートメントを使用して宣言されます。

方法

メソッドは、クラス内のオブジェクトの動作を表す関数またはプロシージャです。 クラスのメソッドは、クラスの任意の属性にアクセスできます。 メソッドの定義にはパラメーターを含めることもできるため、メソッドが呼び出されたときにこれらのパラメーターに値を指定できます。 メソッドの定義は、クラス宣言で宣言され、クラスの実装部分で実装されます。 METHODおよびENDMETHODステートメントは、メソッドの実装部分を定義するために使用されます。 次の構文は、メソッドを実装する方法を示しています-

METHOD <m_name>.
..........
..........
ENDMETHOD.

この構文では、<m_name>はメソッドの名前を表します。 -CALL METHODステートメントを使用してメソッドを呼び出すことができます。

属性とメソッドへのアクセス

クラスコンポーネントは、これらのコンポーネントへのアクセス方法を制御するパブリック、プライベート、または保護された可視性セクションで定義できます。 プライベート可視性セクションは、クラス外からのコンポーネントへのアクセスを拒否するために使用されます。 このようなコンポーネントには、メソッドなどのクラス内からのみアクセスできます。

パブリック可視性セクションで定義されたコンポーネントには、どのコンテキストからもアクセスできます。 デフォルトでは、クラスのすべてのメンバーはプライベートです。 実際には、プライベートセクションでデータを定義し、パブリックセクションで関連メソッドを定義して、次のプログラムに示すようにクラスの外部から呼び出せるようにします。

  • クラスのPublicセクションで宣言された属性とメソッドには、そのクラスと他のクラス、プログラムのサブクラスからアクセスできます。
  • クラスの保護セクションで属性とメソッドが宣言されている場合、それらのクラスとサブクラス(派生クラス)のみがそれらにアクセスできます。
  • 属性とメソッドがクラスのPrivateセクションで宣言されている場合、それらのクラスのみがアクセスでき、他のクラスはアクセスできません。

Report ZAccess1.
CLASS class1 Definition.
   PUBLIC Section.
      Data: text1 Type char25 Value 'Public Data'.
      Methods meth1.

   PROTECTED Section.
      Data: text2 Type char25 Value 'Protected Data'.

   PRIVATE Section.
      Data: text3 Type char25 Value 'Private Data'.
ENDCLASS.

CLASS class1 Implementation.
   Method meth1.
      Write:/'Public Method:',
            /text1,
            /text2,
            /text3.
      Skip.
   EndMethod.
ENDCLASS.

Start-Of-Selection.
   Data: Objectx Type Ref To class1.
   Create Object: Objectx.
   CALL Method: Objectx→meth1.
   Write:/Objectx→text1.

上記のコードは、次の出力を生成します-

Public Method:
Public Data
Protected Data
Private Data

Public Data

静的属性

静的属性は、CLASS-DATAステートメントで宣言されます。 すべてのオブジェクトまたはインスタンスは、クラスの静的属性を使用できます。 静的属性には、class_name⇒name_1= 'Some Text’のようなクラス名を使用して直接アクセスします。

以下は、行番号4〜8回のテキストを印刷するプログラムです。 クラスclass1を定義し、パブリックセクションでCLASS-DATA(静的属性)とメソッドを宣言します。 クラスとメソッドを実装した後、Start-Of-Selectionイベントで静的属性に直接アクセスします。 次に、クラスのインスタンスを作成し、メソッドを呼び出します。

Report ZStatic1.
CLASS class1 Definition.
   PUBLIC Section.
      CLASS-DATA: name1 Type char45,
                  data1 Type I.
   Methods: meth1.
ENDCLASS.

CLASS class1 Implementation.
   Method meth1.
      Do 4 Times.
         data1 = 1 + data1.
         Write:/data1, name1.
      EndDo.
      Skip.
   EndMethod.
ENDCLASS.

Start-Of-Selection.
   class1⇒name1 = 'ABAP Object Oriented Programming'.
   class1⇒data1 = 0.
   Data: Object1 Type Ref To class1,
         Object2 Type Ref To class1.

   Create Object: Object1, Object2.
   CALL Method: Object1→meth1,
                Object2→meth1.

上記のコードは、次の出力を生成します-

静的属性

コンストラクタ

コンストラクターは、オブジェクトの作成中またはクラスのコンポーネントへのアクセス中に自動的に呼び出される特別なメソッドです。 コンストラクターは、オブジェクトが作成されるたびにトリガーされますが、メソッドを呼び出して一般的なメソッドをトリガーする必要があります。 次の例では、2つのパブリックメソッドmethod1とコンストラクターを宣言しています。 これらのメソッドは両方とも異なる操作を行います。 クラスのオブジェクトの作成中に、コンストラクターメソッドがその操作をトリガーします。

Report ZConstructor1.
CLASS class1 Definition.
   PUBLIC Section.
      Methods: method1, constructor.
ENDCLASS.

CLASS class1 Implementation.
   Method method1.
      Write:/'This is Method1'.
   EndMethod.

   Method constructor.
      Write:/'Constructor Triggered'.
   EndMethod.
ENDCLASS.

Start-Of-Selection.
   Data Object1 Type Ref To class1.
   Create Object Object1.

上記のコードは、次の出力を生成します-

Constructor Triggered

メソッドのME演算子

クラスのパブリックセクションで任意の型の変数を宣言すると、他の実装で使用できます。 変数は、パブリックセクションの初期値で宣言できます。 別の値を持つメソッド内で変数を再度宣言することができます。 メソッド内に変数を書き込むと、システムは変更された値を出力します。 変数の以前の値を反映するには、「ME」演算子を使用する必要があります。

このプログラムでは、パブリック変数text1を宣言し、値で開始しました。 同じ変数を再度宣言しましたが、異なる値でインスタンス化しました。 メソッド内で、「ME」演算子を使用してその変数を記述し、以前に開始された値を取得します。 直接宣言することにより、変更された値を取得します。

Report ZMEOperator1.
CLASS class1 Definition.
   PUBLIC Section.

Data text1 Type char25 Value 'This is CLASS Attribute'.
   Methods method1.
ENDCLASS.

CLASS class1 Implementation.
   Method method1.

Data text1 Type char25 Value 'This is METHOD Attribute'.
   Write:/ME→text1,
         /text1.
   ENDMethod.
ENDCLASS.

Start-Of-Selection.
   Data objectx Type Ref To class1.
   Create Object objectx.
   CALL Method objectx→method1.

上記のコードは、次の出力を生成します-

This is CLASS Attribute
This is METHOD Attribute