クラスオブジェクトの登録
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/04 03:18 UTC 版)
「Smalltalk」の記事における「クラスオブジェクトの登録」の解説
Smalltalk は、クラスの定義をメッセージ式による実行環境へのクラスオブジェクトの登録として実現する。他の言語と異なりクラスオブジェクトの登録は単なる定義ではなく実行環境に対する操作である。1度クラスオブジェクトを登録してイメージファイルを保存すると、明示的にクラスオブジェクトを削除しないかぎりはクラスオブジェクトがイメージファイルに残り続ける。Smalltalk 環境に対するクラスオブジェクトの登録は次の様に記述する。 "DerivedクラスをSmalltalk環境に登録する例"Object"基底クラスオブジェクト"subclass: #Derived"Objectクラスの派生として登録するクラスオブジェクト名の指定"instanceVariableNames:'ia ib ic'"インスタンス(実体)オブジェクトに所属する変数名(インスタンス変数)の指定(空白区切り)"classVariableNames: 'ca cb cc'"クラスオブジェクトと共有する変数名(クラス変数)の指定(空白区切り)"poolDictionaries: 'pa pb pc'"クラスに所属する変数(プール変数)を取り込む辞書の指定(空白区切り)"category: 'example'."Smalltalk環境上でクラス名を表示する際にクラスが所属する分類の指定" poolDictionaries と category を除いては、C++ から派生した言語のクラス定義と概ね同じである。インスタンス変数はインスタンスメソッドのみから参照でき、クラス変数はクラスメソッドとインスタンスメソッドから参照できる。他の言語と異なりインスタンス変数をクラスメソッドから参照することはできない。 Smalltalk におけるクラスの作成は、特殊構文ではなく単なるメッセージ送信である。クラスを登録する際のメッセージは、上記の例のように次のセレクターを使用することが多い。 #subclass:instanceVariableNames:classVariableNames:poolDictionaries:category: しかし、クラスの登録はあくまでメッセージであり自由に作れるため、実行環境には大抵その他のメソッドが用意されている。例えば、近代的な Smalltalk 環境の一つ Pharo では、次のセレクターに対応したメソッドが用意されている。 #subclass:#subclass:category:#subclass:instanceVariableNames:#subclass:instanceVariableNames:classVariableNames:poolDictionaries:category:#subclass:uses: #subclass:uses:instanceVariableNames:classVariableNames:poolDictionaries:category:#variableByteSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category:#variableByteSubclass:uses:ginstanceVariableNames:classVariableNames:poolDictionaries:category:#variableSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category:#variableSubclass:uses:ginstanceVariableNames:classVariableNames:poolDictionaries:category:#variableWordSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category:#variableWordSubclass:uses:ginstanceVariableNames:classVariableNames:poolDictionaries:category:#weakSubclass:instanceVariableNames:classVariableNames:poolDictionaries:category:#weakSubclass:uses:ginstanceVariableNames:classVariableNames:poolDictionaries:category: クラスオブジェクトには、クラス変数とは別途、クラスオブジェクトが Class クラスから派生したインスタンスとして状態を持つためのインスタンス変数がある。このクラスオブジェクトのインスタンス変数はクラスオブジェクト内だけで共有され、インスタンスオブジェクトからは直接使用できない。 Smalltalk 環境に対するクラスオブジェクトのインスタンス変数の登録は次の様に記述する。 Derived class instanceVariableNames: 'ia ib ic'. "クラスオブジェクトのインスタンス変数名(空白区切り)" クラスオブジェクトがもつインスタンス変数には変数を登録した基底クラスと派生クラスで別々の変数領域が確保されるという特筆すべき点がある。これを使用して下記の様にクラスに所属するオブジェクトだけを保持する変数としてつかったりする事ができる。 Object subclass: #Super.Super class instanceVariableNames: 'objects'.Super class methodsFor: 'accessing'!objects ^ objects ifNil: [ objects := OrderedCollection new ].!!Super class methodsFor: 'instance creation'!new | object | object := super new. self objects add: object. ^ object.!!Super subclass: #Derived. Derived new.Derived objects size. "-> 1"Super objects size. "-> 0"
※この「クラスオブジェクトの登録」の解説は、「Smalltalk」の解説の一部です。
「クラスオブジェクトの登録」を含む「Smalltalk」の記事については、「Smalltalk」の概要を参照ください。
- クラスオブジェクトの登録のページへのリンク