オブジェクトの生成と初期化
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/04 03:18 UTC 版)
「Smalltalk」の記事における「オブジェクトの生成と初期化」の解説
オブジェクトの生成には #new セレクターを使ったメッセージを使う。他の言語と違い、new は演算子ではない。 |object|object := Example new. "Exampleクラスオブジェクトに「new」メッセージを送りオブジェクトを生成。" Smalltalk ではクラスオブジェクトのメソッドもインスタンスオブジェクトのメソッドと同様に派生クラスによる再定義が可能である。このため new メソッドを再定義し初期化処理を記載する事が出来る。new メソッドを再定義してしまうとオブジェクトの生成自体が不可能になるように思われるが、本来 new メソッドは #basicNew セレクターを使ったメッセージをBehavior に送ってオブジェクトを生成しているためオブジェクトの生成手段がなくなるわけではない。このため new メソッドを再定義しても 「basicNew」メッセージをBehaviorに送ることでインスタンスオブジェクト生成することが出来る。 ただし、実際の初期化に new メソッドが使われる事は多くない。実際には慣習としてクラスの作者が新たに登録したインスタンス・クリエイションと呼ばれる new とは別の初期化用メソッドが使用される。インスタンス・クリエイションは一般的なクラスオブジェクトのメソッドであり、そのメソッドの内部で 「new」メッセージやその他のインスタンス・クリエイションを使って初期化済みのオブジェクトを生成する役割を持っているだけで基本的にその他のメソッドと変わらない。一般的にinstance creationというプロトコルに登録される。 | number |number := Number readFrom: '10'. "readFrom:がインスタンス・クリエイション". Smalltalk では1個のセレクターに対し1個のオブジェクトから複数のメソッドを関連付けられないため 「new」メッセージの送信によりできる初期化は1個のオブジェクトにつき一通りの初期化だけである。このため複数のインスタンス・クリエイションを用意することで用途に応じた複数の初期化方法を提供しているのである。インスタンス・クリエイションは一般的なメソッドのひとつでしかない。このためインスタンス・クリエイション持つクラスオブジェクトはアブストラクト・ファクトリーとして機能する。 具体的には次のように使われる。 defaultDatabase"既定のデータベースのクラスオブジェクトを定義した派生クラスで再定義可能なメソッド。 オーバーライドされた際は、必ずしもクラスオブジェクトが返されるとは限らず、インスタンス オブジェクトが返される場合もある。"^ PostgreSQL. database"databaseへの接続を返すメソッド。 defaultDatabaseにより返されたPostgreSQLに対し、インスタンス・クリエイションである #connect:セレクターを使ったメッセージが送られ、PostgreSQLのインスタンスオブジェクトが生成される。 ただし、defaultDatabaseは、派生クラスによって再定義できるため、#connect:セレクターを使ったメッセージが 必ずしもPostgreSQLクラスオブジェクトに送られるとは限らない。"^ self defaultDatabase connect: self configuration. また、Smalltalk はクラスメソッドを上書きできるため、インスタンス・クリエイションを次の様に実装する事で基本的な初期化処理を派生元のクラスに任せることができる。 x: aX y: aY^ self newx: aX;y: aY. 上記は、2次元座標用のクラスオブジェクトのインスタンスオブジェクトを初期化する派生元のクラスオブジェクトに実装されたインスタンス・クリエイションである。このクラスオブジェクトを継承した2次元座標用のクラスオブジェクトでは#x:y:セレクターを使ったメッセージに対応するメソッドを実装する必要はない。インスタンス・クリエイションを利用したパターンは Smalltalk では広く利用され、いたる所で見ることが出来る。
※この「オブジェクトの生成と初期化」の解説は、「Smalltalk」の解説の一部です。
「オブジェクトの生成と初期化」を含む「Smalltalk」の記事については、「Smalltalk」の概要を参照ください。
- オブジェクトの生成と初期化のページへのリンク