● new の謎
以下、「Smalltalk by Example」 (Alec Sharp著) 29章、Meta-Programming の抜書きと実験。 内容は、Squeakに置き換えてあります。 ・an OrderedCollection が class OrderedCollection のインスタンスであると同じく、 class OrderedCollection も他のクラスのインスタンスである。この、インスタンスがクラスである クラスをメタクラスという。従って、class OrderedCollection はそのメタクラスのインスタンスで ある。 ・新しいクラスを定義すると、新しいメタクラスが自動的につくられる。そのメタクラスは一つだけイン スタンスを持っている。定義された新しいクラスだ。 ・メタクラスは class MetaClass のインスタンスであり、名前は無い。したがって、Browserでみること は出来ない。 ・Squeakで、以下のコマンドを打ってみる Object allSubclasses size. ->3176 Smalltalk classNames size. ->1592 Object は、Smalltalk のクラス名の約2倍の数をもっている。これが、各クラスが独自のメタクラスを 持っていることを示す。 ・クラスはメタクラスのインスタンスなのだから、我々がクラスメソッドと考えるのは、実際は、クラスの メタクラスのインスタンスメソッドである。 ・クラスのメタクラスの methodDic 変数に、クラスのインスタンスが呼び出す(クラス)メソッドを登録 している。 ・実験。実際にメタクラスを見てみる。(BankAccountチュートリアルの例:どのクラスでもいい) Workspace で BankAccount inspect. と入力して alt -d Workspace で BankAccount class inspect. と入力して alt -d
|
BankAccount クラス メソッドデクショナリには、インスタンス メソッドが並んでいる。 ・balance, balance:, deposit:, historyMorph, initialize, wihtdraw |
|||||
|
BankAccount クラス のメタクラス メソッドデクショナリには、BanAccount の クラスメソッドが見える。 ・execute, new superclass は Object class である |
|||||
|
クラス変数 Ownerを追加した。これは、BankAccount のプール辞書に見える クラスインスタンス変数を追加した。 メタクラスのインスタンス変数に表示される |