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

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
15 行
 
== 特徴 ==
オブジェクト指向プログラミングでは、オブジェクトを使用しますが、OOP対応を謳っている言語でも、関連する技術や構造のすべてが直接サポートされているわけではなく、(メソッドやメッセージではなく)被演算子と演算子という数式アナロジーが使われます。
以下の機能は、クラス指向やオブジェクト指向が強いとされる言語(またはOOP対応のマルチパラダイム)に共通するものであるが、特筆すべき例外もあります。
 
=== 関連する技術や構造 ===
継承(inheritance)、凝集度(cohesion)、抽象化(abstraction)、ポリモーフィズム(polymorphism)、結合(coupling)、カプセル化(encapsulation)
 
=== クラスベースとプロトタイプベース ===
30 ⟶ 33行目:
一部の言語では、クラスとオブジェクトは、traitやMix-inなどの他の概念を用いて構成することができる。
 
==== クラスベースのオブジェクト指向 ====
クラスベースの言語では、あらかじめクラスが定義されており、オブジェクトはクラスに基づいてインスタンス化されます。<!-- これはインスタンス化というより継承の例 → 例えば、appleとorangeという2つのオブジェクトがFruitというクラスからインスタンス化された場合、それらは本質的に果物であり、同じように扱うことができることが保証されています。-->
 
39 ⟶ 42行目:
オブジェクトfruitが存在し、appleとorangeの両方がそのプロトタイプとしてfruitを持っていれば、2つの異なるオブジェクトappleとorangeをfruitと呼ぶことができます。フルーツクラスという考え方は明示的には存在しませんが、同じプロトタイプを共有するオブジェクトの等価クラスとして存在しています。プロトタイプの属性とメソッドは、このプロトタイプによって定義された等価クラスのすべてのオブジェクトに委譲されます。オブジェクトが個別に所有する属性やメソッドは、同じ等価クラスの他のオブジェクトでは共有されない可能性があります。例えば、属性 sugar_content は、予期せず apple には存在しないかもしれません。プロトタイプを使って実装できるのは、単一継承のみです。 -->
 
===== オブジェクトとクラス =====
 
;クラス:与えられたタイプまたはクラスのオブジェクトのデータフォーマットと利用可能な手続きの定義。データと手続き(クラスメソッドとして知られている)自体を含むこともあり、つまりクラスはフィールド(データメンバー・属性とも)とメソッド(メンバー関数とも)を含む。
;オブジェクト
60 ⟶ 62行目:
クラスを用いたオブジェクト指向プログラミングをクラスベース・プログラミングと呼ぶことがあるが、プロトタイプベース・プログラミングではクラスを用いないのが一般的である。そのため、オブジェクトとインスタンスの概念を定義するために、大きく異なるが類似した用語が使用されている。
 
==== プロトタイプベースのオブジェクト指向 ====
多くのオブジェクト指向プログラミング言語はクラスベースですが、殆どのウェブブラウザはJavaScriptエンジンを搭載していることから、プロトタイプベースのオブジェクト指向言語が使われ機会は多く、WikibooksのインフラストラクチャーであるMediaWikiのモジュールの記述言語のLuaもプロトタイプベースのオブジェクト指向言語です。
 
84 ⟶ 86行目:
カプセル化は、結合度の低減(''decoupling'')を促進する技術です。
 
=== 合成包含、継承、および委譲 ===
;包含
オブジェクトは、そのインスタンス変数に他のオブジェクトを含めることができますが、これをオブジェクト・コンポジションといいます。
たとえば、Employee クラスの:オブジェクトは、"first_name" や "position" といった自身のインスタンス変数に加えて、Address クラスのオブジェクトを (直接またはポインタを介して) めることができますが、これを包含(オブジェクト・コンポジション)といいます。
:たとえば、Employee クラスのオブジェクトは、"first_name" や "position" といった自身のインスタンス変数に加えて、Address クラスのオブジェクトを (直接またはポインタを介して) 含むことができます。
 
;継承
:オブジェト指向プログミングをサポートしている言語は、ほとんどの場合、継承をサポートしています。
:これにより、クラスを「~である」という関係を表す階層に配置することができます。
例えば、Employee クラスは Person クラスを継承しています。
:例えば、Employee クラスで利用できるデータやメソッド、子 Person クラスにも同じ名前で表示されを継承しています。
:親クラスで利用できるデータやメソッドは、子クラスにも同じ名前で表示されます。
:例えば、Person クラスは、"first_name" と "last_name" という変数を "make_full_name()" というメソッドで定義しています。
:これらはEmployeeクラスでも使用可能で、Employeeクラスには変数 "position "と "salary "が追加されるかもしれません。
この手法では、同じプロシージャやデータ定義を簡単に再利用できるだけでなく、現実世界の関係を直感的に反映できる可能性があります。
:この手法では、同じプロシージャやデータ定義を簡単に再利用できるだけでなく、現実世界の関係を直感的に反映できる可能性があります。
:開発者は、データベースのテーブルやプログラミングのサブルーチンを利用するのではなく、ユーザーがより慣れ親しんでいるであろうオブジェクト、つまりアプリケーション・ドメインのオブジェクトを利用します。
:サブクラスは、スーパークラスで定義されたメソッドをオーバーライドできます。
 
:;多重継承
サブクラスは、スーパークラスで定義されたメソッドをオーバーライドできます。
::一部の言語では多重継承が可能ですが、オーバーライドの解決が複雑になる可能性があります。
::多重継承が可能な言語では、Mix-inは単なるクラスであり、is-a-type-ofの関係を表していません。
:;MIx-in
Mix-inは通常、複数のクラスに同じメソッドセットを追加するために使用されます。
::Mix-inは通常、複数のクラスに同じメソッドセットを追加するために使用されます。
::例えば、UnicodeConversionMixinクラスは、共通の親を持たないFileReaderクラスとWebPageScraperクラスにインクルードすることで、unicode_to_ascii()というメソッドを提供することができます。
:;抽象クラスは
 
::抽象クラスは、インスタンス化してオブジェクトにすることはできません。
::抽象クラスは、インスタンス化できる他の「具象」クラスに継承するためにのみ存在します。
:Javaでは、クラスがサブクラス化されるのを防ぐためにfinalキーワードを使用することができます。
 
継承よりも構成を重視する考え方は、継承の代わりに構成を用いてhas-a関係を実装することを提唱しています。