JavaやC++のような[[オブジェクト指向>アドオン/オブジェクト指向]]を採用した[[ABAP]]で、手続き型プログラミングとは異なり、''クラス''を用いる。
----
#contents
----
JavaやC++のような[[オブジェクト指向>アドオン/オブジェクト指向]]を採用した[[ABAP]]で、手続き型プログラミングとは異なり、''クラス''を用いる。
* 概要 [#ubca44c7]
本来的な定義は、オブジェクトの設計図の様なもので、具体的にはデータ自体や処理も包含する。
また、それらが外部アクセス可能か内部処理のみか、可変なのか変更不可なのかなどの性質も定義する。
SAPにおいては、[[BADI>SAPの拡張手段/BAdI]]や[[汎用モジュール>SAPのオブジェクト/汎用モジュール]]の様な利用法が主である。
** クラス [#k2780790]
データやプロセスetcのあらゆるものを''オブジェクト''とし、それをプログラムで利用するために作成するための設計図のこと。
クラスには、プロパティ(属性)とメソッドがあり、プログラムの中で''インスタンス''とすることで、利用可能となる。
クラスを人に見立てれば、プロパティは名前・年齢・身長・体重など、メソッドは食べる・働く・寝る・さぼるなど。
*** プロパティ [#x729c661]
要は''値''。
そのクラスで共有しデータを保持することが可能で、主に数値や文字列にできるのものが該当する。
*** メソッド [#j8f5569b]
要は''動作''。
[[サブルーチン>アドオン/サブルーチン]]や[[関数>アドオン/関数]]という認識でok。
** 可視性 [#kc7a897c]
何を言っているかというと、クラスの内と外で照会/更新可能かどうかを規定する考え方。
なぜこんな話が出てくるか?
それは、[[グローバル変数>アドオン/グローバル変数]]がもたらす負の面を考えれば、自ずと答えが出るかと思う。
*** PUBLIC SECTION [#x91f5c4b]
クラスの内外を問わずアクセス可能。
主に、外部からの影響を受けて動作するメソッドが該当し、クラス定義でPUBLIC SECTION. と記述する。
*** PROTECTED SECTION [#kcdf5bc2]
クラスの内と継承関係にあるクラスからのアクセスが可能。
継承関係のないクラス等の外部からのアクセスは不可能で、クラス定義でPROTECTED SECTION. と記述する。
*** PRIVATE SECTION [#d2818389]
クラスの内からのみのアクセス可能。
外部は当然のことながら継承関係があるクラスからのアクセスも全て遮断し、クラス定でPRIVATE SECTION. と記述する。
** インスタンスとスタティック [#v17eaea4]
クラスは通常インスタンス化し、その後そのクラスが持つコンポーネントを利用するが、一部についてはインスタンス化を行わずに利用することができる。
*** インスタンスコンポーネント [#la4020ac]
インスタンス化が行われていることを前提として利用されるコンポーネントを、インスタンスコンポーネントと呼び、各インスタンス毎に個別に割り当てられる。
*** スタティックコンポーネント [#a6bfa07c]
インスタンス化を行わなくても利用できるコンポーネントを、静的コンポーネントと言う。これらは、インスタンスがなくても利用できるため、各クラスに1つ存在する。
つまり、そのクラスから生成されたすべてのインスタンスが共有で持つことになる。
* まとめ前のメモ [#beb15dfc]
** 抽象クラス [#x3771ad6]
*** 抽象メソッド [#j9f8ee42]
** ファイナルクラス [#nb561bcc]
*** ファイナルメソッド [#q40d8ff1]
** フレンドシップ [#ja98405d]
** シングルトン [#o5f96cfe]
** 永続クラス [#n12a3eb0]
** インタフェース [#xc763d1b]
クラスで利用するメソッドの定義だけを行ったもので、メソッドの実装はインタフェースを利用するクラス内で具体的に定義する。
そのことにより、各クラスは実装だけを、そのクラスの特性に基づき記述するだけでメソッドを定義、実装することができ、主に多態性を実現するために利用される。
[[ABAP]]では多重継承が認められておらず、インタフェースを利用することで多重継承をシミュレートすることが可能。
例えば、和食クラスと洋食クラスと中華クラスがあり、共通メソッド''食べる/食べられる''をインタフェースとして定義。
クラス間に継承の関係はないが、インタフェースでアップキャストし食べるメソッドを呼び出せる。
*** 多態性 [#pc2ea5ce]
一つの要求に対して各々が別々の動きを行うことで、ポリモフィズムとも呼ぶ。
一言に「勉強しろ」と言っても、学生はドリルをやったり本を読み、社会人は実務経験を積もうとする。
これをプログラムで表現するため、継承・キャスト・インタフェースといった技術がある。
** イベント [#h2de138e]
あるクラスの状態の変化などを知らせる信号のことでインスタンスによってトリガされ、別のクラスやオブジェクトに対して動作の切っ掛けを与えることができる。
この時、イベントをトリガした側をセンダ、そのイベントに反応する側をハンドラと呼ぶ。
[[EVENT>ABAP/EVENT]]参照。
*** イベントの定義 [#u45c49f5]
クラス定義の中で定義する。[[EVENT>ABAP/EVENT]]参照。
*** イベントのトリガ [#j17c8a01]
メソッド内でイベントをトリガしたいタイミングで、[[RAISE EVENT>ABAP/RAISE EVENT]]。
*** ハンドラメソッドの定義 [#b1e9594f]
イベントに反応させたいメソッドをハンドラメソッドと呼び、これを定義する。
普段の[[メソッド定義>ABAP/METHOD]]の後ろに、FOR EVENT 〜を追加する。
普段の[[メソッド定義>ABAP/METHOD]]の後ろに、FOR EVENT ~を追加する。
パラメータの設定は、イベント定義の後。
*** ハンドラメソッドのインスタンスへの割当 [#kd08cd44]
イベント処理を行わせたいインスタンスに対して [[SET HANDLER>ABAP/SET HANDLER]] (ハンドラメソッド名) FOR (インスタンス指定)を記述。インスタンス生成時でも可。
今後生成される(センダ側)インスタンスなども含め、全てのインスタンスに反応させたい場合は ALL INSTSNCE オブションを記述する。
他にオプションとして、ACTIVATION X or ''があり、これを使うと、割当と解除を個別で行うことができる。
~
~
CENTER:【スポンサードリンク】
#htmlinsert(amazon_book_sap_system_implement)
~
~
----
#pcomment(reply)