クラスオブジェクトとMetaclass
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/04 03:18 UTC 版)
「Smalltalk」の記事における「クラスオブジェクトとMetaclass」の解説
クラスオブジェクトもオブジェクトであるため、所属するクラスが存在している。クラスオブジェクトが所属するクラスはMetaclassというクラスのインスタンスオブジェクトである。 ByteString. "-> ByteString"ByteString class. "-> ByteString class"ByteString class class. "-> Metaclass" Metaclassも当然ながらクラスに所属しており、再帰的にMetaclassに属するようになっている。 ' ' class. "-> ByteString"' ' class class. "-> ByteString class"' ' class class class. "-> Metaclass"' ' class class class class. "-> Metaclass class"' ' class class class class class. "-> Metaclass"' ' class class class class class class. "-> Metaclass class" クラスオブジェクトが所属するMetaclassのインスタンスオブジェクトは特殊なオブジェクトであり、クラスの継承階層と同様に継承階層を持っている。 Collection class superclass. "-> Object class"Object class superclass. "-> ProtoObject class"ProtoObject class superclass. "-> Class" クラスオブジェクトはMetaclassから生成された単なるオブジェクトで有ることから、Smalltalkが標準で提供するクラスオブジェクトとは異なる独自の構造をもったクラスオブジェクトを作ることができる。 例えば以下のようにメソッドの変わりにブロックを持つ無名クラスを作成することも出来る。 | class object |"Metaclassからクラスオブジェクトを生成"class :=Class newsuperclass: Object;methodDictionary: MethodDictionary new."生成したクラスオブジェクトのセレクターにメソッドではなくブロックを紐付け"classmethodDictionaryadd:#something1: -> [ :value | value ] block;add:#something2 -> [ 2 ] block."生成したクラスオブジェクトをインスタンスオブジェクトの生成に使用"object := class new.Transcriptshow: ( object something1: 1 ) printString;nl."生成したクラスオブジェクトを基底クラスとして使用"classsubclass:#ExampleinstanceVariableNames:''classVariableNames:''poolDictionaries:''category:''.
※この「クラスオブジェクトとMetaclass」の解説は、「Smalltalk」の解説の一部です。
「クラスオブジェクトとMetaclass」を含む「Smalltalk」の記事については、「Smalltalk」の概要を参照ください。
- クラスオブジェクトとMetaclassのページへのリンク