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

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
語尾の統一
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
25 行
OOPをサポートする言語では、コードの再利用と拡張性のために、クラスまたはプロトタイプの形で継承を使用するのが一般的です。クラスを使用する言語は、2つの主要なコンセプトをサポートしています。
 
; [[#クラスベースのオブジェクト指向|クラスベース]]
: 型→ユーザー定義の型の概念の拡張である「クラス」を特徴にします。
: クラスとインスタンスは、型と変数の指し示している領域に対応します。
; [[#プロトタイプベースのオブジェクト指向|プロトタイプベース]]
: クラスベースのクラスに相当するものはなく、既存のオブジェクトを雛形に新たなオブジェクトを生成し、新たなオブジェクトは雛形となったオブジェクトからフィールドとメソッドを引き継ぎます。
 
34 行
 
==== クラスベースのオブジェクト指向 ====
クラスベースの言語では、あらかじめクラスが定義されており、オブジェクトはクラスに基づいてインスタンス化されます。<!-- これはインスタンス化というより継承の例 → 例えば、appleとorangeという2つのオブジェクトがFruitというクラスからインスタンス化された場合、それらは本質的に果物であり、同じように扱うことができることが保証されています。-->
 
プロトタイプベースの言語では、オブジェクトが主な実体です。クラスも存在しません。オブジェクトのプロトタイプは、そのオブジェクトがリンクされている別のオブジェクトに過ぎません。すべてのオブジェクトは、1つのプロトタイプリンクを持っています(1つだけです)。新しいオブジェクトは、プロトタイプとして選ばれた既存のオブジェクトに基づいて作成することができます。
 
プロトタイプベースの言語では、本質的にインスタンス化と継承は同じメカニズムの別の角度から見た射影です。
<!--
オブジェクトfruitが存在し、appleとorangeの両方がそのプロトタイプとしてfruitを持っていれば、2つの異なるオブジェクトappleとorangeをfruitと呼ぶことができます。フルーツクラスという考え方は明示的には存在しませんが、同じプロトタイプを共有するオブジェクトの等価クラスとして存在しています。プロトタイプの属性とメソッドは、このプロトタイプによって定義された等価クラスのすべてのオブジェクトに委譲されます。オブジェクトが個別に所有する属性やメソッドは、同じ等価クラスの他のオブジェクトでは共有されない可能性があります。例えば、属性 sugar_content は、予期せず apple には存在しないかもしれません。プロトタイプを使って実装できるのは、単一継承のみです。 -->
 
===== オブジェクトとクラス =====
63 ⟶ 57行目:
 
==== プロトタイプベースのオブジェクト指向 ====
プロトタイプベースの言語では、オブジェクトが主な実体です。クラスも存在しません。オブジェクトのプロトタイプは、そのオブジェクトがリンクされている別のオブジェクトに過ぎません。すべてのオブジェクトは、1つのプロトタイプリンクを持っています(1つだけです)。新しいオブジェクトは、プロトタイプとして選ばれた既存のオブジェクトに基づいて作成することができます。
 
プロトタイプベースの言語では、本質的にインスタンス化と継承は同じメカニズムの別の角度から見た射影です。
 
多くのオブジェクト指向プログラミング言語はクラスベースですが、殆どのウェブブラウザはJavaScriptエンジンを搭載していることから、プロトタイプベースのオブジェクト指向言語が使われ機会は多く、WikibooksのインフラストラクチャーであるMediaWikiのモジュールの記述言語のLuaもプロトタイプベースのオブジェクト指向言語です。