Smalltalk use: better; episode: #001b ”メタプログラミングへの道”
《前の記事|記事一覧|次の記事》
Smalltalk use: better;
episode: 001メタプログラミングへの道
目標に向かって一段ずつ階段を上っていく上で
いちばん肝心なことは
必ず最初の一段を上るということである
そしてまた次に一段上るということである
Hideo Itokawa - Wikipedia
■ クラスを定義する:メタプログラミング
クラスを定義するために利用者(プログラマー)が行った操作はすべて、プログラム(コードの断片)で再現できます。そこで、Person と同等のクラス Person2 を定義する過程を通して、その理解を深めます。
☞《余録》ツールを使ってクラス/メソッドを定義する
ツールを利用して定義したクラスには、次の記述が見つかります。
Smalltalk defineClass: #Person superclass: #{Core.Object} indexedType: #none private: false instanceVariableNames: 'name ' classInstanceVariableNames: '' imports: '' category: ''
よく見るとこのクラス定義そのものが「メッセージ式」になっています。つまり、クラスオブジェクト Smalltalk に向けて、あるメッセージを送信しています。ただし、有効なクラスを定義するには、不十分です。というのも、パッケージを指定していないからです。
□ ワークスペースを開く
メニューから[ツール→ワークスペース]を選択します。すると、新たなワークスペースが現れます。タブ項目[1 ページ]に、次のコードの断片を記入します。
category := 'Tutorial-Apple'. aPackage := Store.Registry packageNamed: category. aClass := Smalltalk defineClass: #Person2 superclass: #{Core.Object} indexedType: #none private: false instanceVariableNames: 'name' classInstanceVariableNames: '' imports: '' category: category. aClass comment: 'Smalltalk Tutorial'. aPackage addClass: aClass
クラスを定義するには、メソッド NameSpace>>defineClass:superclass:indexedType:private:instanceVariableNames:classInstanceVariableNames:imports:category: を利用します。ここでは、注目すべき引数だけを紹介します。
- defineClass: 定義したいクラスの名前を、シンボルで指定します
- superclass: 親となるクラスの名前を、シンボルで指定します。ただし、名前にピリオドが含まれるときには、括弧 #{Core.Object} で囲みます
- instanceVariableNames: インスタンス変数の名前を、文字列で指定します
- category: カテゴリーの名前を、文字列で指定します
必要なら、メソッド ClassDescription>>comment: を利用して、コメントを追加できます。
↑ TOP
*Created: 1989/01/29|Last updated: 2013/03/25 19:52:17