インスタンス
この記事の正確性に疑問が呈されています。 |
オブジェクト指向におけるインスタンス
編集オブジェクト指向言語においては、多くの場合クラスと呼ばれるものを元に作成したオブジェクトの実体を指す。データモデルやオブジェクト指向設計においても用いられる用語である。 インスタンスを生成するプロセスをインスタンス化 (instantiation、動詞形instantiate)という。
概要
編集オブジェクト指向において、クラスあるいは型はオブジェクトの分類(分類概念)や集合に相当している。 あるクラス C のインスタンスとは、C という分類に属する(分類される)オブジェクトのことである。 Smalltalkの影響が強い言語では、クラス自体もまたオブジェクトとして扱うことができる(これをクラス・オブジェクトと言う)。そのような場合は特に、「クラスC のオブジェクト」といった言い方では、「クラスC に属するオブジェクト」の意味か「クラスC そのものを表すオブジェクト」の意味か曖昧になる。この場合、「クラスC のインスタンス」という言い方が利用できる。 クラス・オブジェクトと対比して、「インスタンス・オブジェクト」という言葉も使われている。
オブジェクト指向におけるインスタンスという言葉は、元々Sketchpadという言語の"Master"から"Instance"を生成するという仕組み"instance drawings"が由来となっている用語である。[1]そしてC++と並びオブジェクト指向の概念を築づいたSmalltalkが、この"Master"と"Instance"の関係をクラスから生成されたオブジェクトになぞらえ、クラスから生成されたオブジェクト(インスタンス・オブジェクト)の意味で使い始めインスタンス・オブジェクトを表す言葉として定着させた。[2]
静的型付けのオブジェクト指向言語では珍しいが、動的型付けのオブジェクト指向言語の多くは、メタクラスをサポートし、クラス自体もオブジェクトとして扱うことができる(クラス・オブジェクト)。クラス・オブジェクトは、端的に言えば変数に束縛できるクラスである。クラス・オブジェクト、インスタンス・オブジェクト双方を変数に束縛した際どちらもオブジェクトとして振る舞い見かけ上区別はつかない。例えばクラス・オブジェクト、インスタンス・オブジェクト双方が readFrom: というメソッドを持っていた場合、どちらも #readFrom: メッセージを送ってやるとエラーも起こさずそれぞれのメソッドを実行する。
Objective-CやPythonにおいてはクラス・オブジェクトとインスタンス・オブジェクトの明確な区別が行われている。[3][4]
メタクラスがサポートされているシステムでは、クラス・オブジェクトもまた別のクラス(メタクラス)のインスタンスであるということがありうる。この場合「クラス・オブジェクトはインスタンスではない」とは言えないので、注意されたい。
脚注
編集- ^ http://gagne.homedns.org/~tgagne/contrib/EarlyHistoryST.html
- ^ http://stephane.ducasse.free.fr/FreeBooks/BlueBook/
- ^ Objective-C Runtime Reference[1]
- ^ Classes ― Python v2.7.3 documentation[2]