削除された内容 追加された内容
14行目:
この'''抽象'''(''abstraction'')という考え方の有無がモジュールとクラスの分水嶺になっている。OOPの説明で犬や猫や車といった比喩話が多用されるのは、OOPそのものがプログラム要素の抽象化を前提にしたパラダイムだからである。犬や猫はしばしばひんしゅくを買うが、OOPでは変数や関数といったプログラム要素構造に焦点を当てずにその構造の[[操作的意味論|振る舞い的意味]]に焦点を当てているので、クラスの設計とはそれら振る舞い同士の繋がりを設計するのと同義になり、それを説明する上で最適なのは現実世界の例え話という結論に行き着くことになる。
 
抽象化は変数、関数、クラスのいずれもが対象になる。変数の抽象化とは同クラス所属の関数を通して変数を参照/変更することを指し、その実装のために[[This (プログラミング)|this参照]]の仕組みが必要になり、またその徹底のために変数の情報隠蔽が必要になる(A)。OOPの情報隠蔽は変数が主眼なのでデータ隠蔽とも読み替えられる。関数の抽象化は中間参照を通しての呼び出しを指しこれは[[関数ポインタ]]と同義であるが、OOPでは基底抽象クラスと派生実装クラスに分けて抽象クラスに呼び出し用の中間参照を置き、実装クラスに呼び出し先の関数実体を置く。関数の中間参照は抽象関数と言い換えられる。これによって基底クラスの抽象関数をなんでもポインタにせずに、その派生クラスに置く同名実装関数のみに限定するという制約を課してまとめることができる(B)。従って関数の抽象化には、基底クラスと派生クラスを連結する構造が必要になる(C)。変数を持たずに抽象関数だけをまとめたクラスは、抽象化されたプログラムモジュールになる(D)。そのプロシージャ関数でプロセス、セッター関数でデータ変更、ゲッター関数でデータ取得を表現できるからである。この抽象モジュールは基底クラスと同義なので様々な派生クラスを実装できる(E)。
 
上述の(A)と(D)は[[カプセル化]]、(C)と(E)は[[継承 (プログラミング)|継承]]、(B)と(E)は[[多態性|ポリモーフィズム]]に相当しこれらはOOPの三大原則などと呼ばれる。クラスの定義は諸説あるが、モジュールのプログラム概念にこの三原則仕様を表現する機能を加え、<code>instance.method()</code>のように書式されてその<code>method</code>内では<code>instance</code>のメンバに暗黙アクセスできる[[This (プログラミング)|this参照]]の機能を加え、コンストラクタによるインスタンス生成とデストラクタによるインスタンス破棄の機能も加えたものがクラスになる。それに[[メタクラス]]の仕組みが加えられることもある。
 
=== インスタンス ===
クラスはインスタンスのひな型であり、インスタンスとはクラスを量化(''quantification'')したものである。この量化を担当するのがコンストラクタである。ここでの量化とはクラス内の変数の内容を全て決定してメモリに展開することを指す。各変数内容の決定は初期化と呼ばれる。初期化の仕方は、コンストラクタに渡された引数を代入する方法、コンストラクタに渡された引数を任意に解釈/加工した値を代入する方法、ゼロやnull値を代入する方法、暗黙のデフォルト値を代入する方法、展開メモリ領域のその時の電荷状態のランダムビット列をそのまま値にしてしまう方法などに分かれる。またこれは言語によって実装が分かれるが、関数の中間参照テーブルも合わせてメモリ展開されることもある。クラスの変数および関数の中間参照テーブルをメモリに展開することを指してインスタンス生成という。

インスタンスはデータ構造体[[This (プログラミング)|this参照]]ように扱わ機能を備えている。こ、また<code>インスタンス.関数()</code>などような書式で呼び出された関数にインスタンスアドレスが暗黙引をデフォルトで扱う関数を呼び出すこして渡されてこれthis参照になり、その関数内ではインスタンスのメンバに暗黙アクセスできるという仕組みである。の関数は量化元クラスで定義されたものであている。インスタンスはコレクションとしても扱える関数付き普通に[[構造体|データ構造体のユニット表現になり、OOP特有の柔軟なプロセス表現を可能にす]]としても扱える。
 
=== メタクラスとリフレクション ===
[[メタクラス]]とは[[クラス (コンピュータ)|クラス]]の定義情報を閲覧/変更できる機能である。定義情報はメンバ変数/関数の構成、スーパークラス、[[アノテーション]]などを指す。クラスベースのクラスは、コンパイル前の事前定義である[[静的型付け]]である。そのメタクラスにはシステム側が提供する特別なインターフェースを通してアクセスすることになる。専用の[[Application Programming Interface|API]]で指定クラスのメタクラスのインターフェース・インスタンスを呼び出して、それを通してクラス定義情報の閲覧と変更を行なう。裏方メタクラスの情報変更が、表方クラスとそのインスタンスの動作変更に反映されることを指して[[リフレクション (情報工学)|リフレクション]]と言う。また、実行時の文字列データをインターフェースの引数にして、その文字列が指すメンバ変数/関数にアクセスできる機能も[[リフレクション (情報工学)|リフレクション]]とされる。実行時の文字列データがアクセス指定に反映されるといった意味合いである。これは動的ディスパッチなどに応用される。
 
=== ソフトウェアモデリング ===