「オブジェクト指向プログラミング」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
語尾の統一
タグ: 2017年版ソースエディター
10 行
オブジェクト指向プログラミング言語は、オブジェクト指向プログラミングを構文やライブラリで支援することで、より容易により木目細かなエラーチェックを行うことを実現したプログラミング言語です。
 
オブジェクト指向プログラミング言語を使っても、オブジェクト指向プログラミングとは言い難いプログラミングスタイル(例:プロシージャを整頓するためだけにクラスを使い、機能が互いの機能に関係がないようなプログラミング)は可能です。
 
また、非オブジェクト指向プログラミング言語(例:[[C言語]])を使ったとしても、カプセル化・継承・ポリモーフィズムなどのオブジェクト指向プログラミングの特徴を持ったプログラミングは可能です(例:[[W:X Toolkit Intrinsics|X Toolkit Intrinsics]]のウィジェットを継承し、新たなルックアンドフィールを持った[[W:en:X Athena Widgets|X Athena Widgets]]や[[W:en:Motif (software)|Motif Widgets]]は実装されています)。
31 行
: クラスベースのクラスに相当するものはなく、既存のオブジェクトを雛形に新たなオブジェクトを生成し、新たなオブジェクトは雛形となったオブジェクトからフィールドとメソッドを引き継ぎます。
 
一部の言語では、クラスとオブジェクトは、traitやMix-inなどの他の概念を用いて構成することができます
 
==== クラスベースのオブジェクト指向 ====
43 行
 
===== オブジェクトとクラス =====
;クラス:与えられたタイプまたはクラスのオブジェクトのデータフォーマットと利用可能な手続きの定義。データと手続き(クラスメソッドとして知られています)自体を含むこともあり、つまりクラスはフィールド(データメンバー・属性とも)とメソッド(メンバー関数とも)を含む。
;オブジェクト
:クラスのインスタンス
53 行
各オブジェクトは、特定のクラスのインスタンスであると言われています(例えば、nameフィールドに "Mary"が設定されているオブジェクトは、Employeeクラスのインスタンスであると言えます)。オブジェクト指向プログラミングにおけるプロシージャはメソッドと呼ばれ、変数はフィールド、メンバー、アトリビュート、またはプロパティとも呼ばれます。そのため、以下のような用語があります。
 
;クラス変数:クラス全体に属するもので、1つのコピーしか存在しないません
;インスタンス変数または属性:個々のオブジェクトに属するデータで、各オブジェクトはそれぞれのコピーを持っています。
;メンバー変数:特定のクラスで定義されているクラス変数とインスタンス変数の両方を指します。
;クラスメソッド:クラス全体に属し、クラス変数とプロシージャコールからの入力にのみアクセスできます
;インスタンス・メソッド:個々のオブジェクトに属し、呼び出された特定のオブジェクトのインスタンス変数、入力、およびクラス変数にアクセスできます。
オブジェクトは、複雑な内部構造を持つ変数のようにアクセスされ、多くの言語では効果的にポインタとなり、ヒープやスタック内のメモリにある当該オブジェクトの単一インスタンスへの実際の参照として機能します。オブジェクトは、内部コードと外部コードを分離するために使用できる抽象化の層を提供しま。外部のコードは、特定の入力パラメータセットで特定のインスタンスメソッドを呼び出したり、インスタンス変数を読み込んだり、インスタンス変数に書き込んだりすることで、オブジェクトを使用することができます。オブジェクトは、コンストラクタと呼ばれるクラス内の特殊なメソッドを呼び出すことで生成されます。プログラムは、実行中に同じクラスのインスタンスを多数作成し、それらが独立して動作することがあります。これは、同じ手順を異なるデータセットに対して使用するための簡単な方法である
 
クラスを用いたオブジェクト指向プログラミングをクラスベース・プログラミングと呼ぶことがあるが、プロトタイプベース・プログラミングではクラスを用いないのが一般的である。そのため、オブジェクトとインスタンスの概念を定義するために、大きく異なるが類似した用語が使用されています
 
==== プロトタイプベースのオブジェクト指向 ====
67 行
=== 動的ディスパッチ/メッセージパッシング ===
メソッドの呼び出しに応じて実行する手続きコードを選択するのは、外部のコードではなく、オブジェクト管理機構の責任で、通常はオブジェクトに関連付けられたテーブルから実行時にメソッドを検索します(仮想関数テーブル)。
この機能は動的ディスパッチとして知られており、オブジェクトと、すべてのインスタンスに対して操作の実装が固定されています(静的な)抽象データ型(またはモジュール)とを区別しています。
呼び出しの可変性が、呼び出されたオブジェクトの単一の型以上に依存している場合(つまり、少なくとも1つの他のパラメータオブジェクトがメソッドの選択に関与している場合)、多重ディスパッチと言います。
 
73 行
 
=== カプセル化 ===
カプセル化は、オブジェクト指向プログラミングの概念の一つで、データとそのデータを操作する関数を結びつけ、外部からの干渉や誤用から両者を保護することである。データのカプセル化は、OOPの重要な概念である「データの隠蔽」につながっています
 
クラスが呼び出しコードにオブジェクトの内部データへのアクセスを許可せず、メソッドを通してのみアクセスを許可している場合、これはカプセル化として知られる強力な抽象化または情報隠蔽の形態です。
一部の言語(C++やJavaなど)では、クラスがアクセス制限を明示的に行うことができます。
例えば、内部データをprivateキーワードで表し、クラス外のコードが使用することを意図したメソッドをpublicキーワードで指定します。
メソッドにはpublic、privateのほか、protected(同じクラスとそのサブクラスからのアクセスは許可するが、異なるクラスのオブジェクトからのアクセスは許可しないません)のような中間レベルのデザインもあります。
他の言語(Pythonなど)では、カプセル化は慣例によってのみ強制されます(例えば、プライベートメソッドの名前はアンダースコアで始まることがあります)。
カプセル化することで、外部のコードがオブジェクトの内部動作に関与することを防ぐことができます。