06/05/06 01:13:43
>>98
> ・なぜ「open」という存在を知っていたのか、
知りませんでした。が、クラスメソッドで見つけました。
> ・それがインスタンスでなくてクラスである理由
いろいろと複雑な事情がありますが、簡単にいえば単なる慣習です。
MVC でいうところの M(モデル)の属するクラスのクラスメソッドに V や C を担当する
クラスと関連付けをする作業を定義することをよくします。
> ちなみに、Morphにおける「new」というメソッドは
> なぜ有効なんでしょう。
#new は Behavior に定義されています。
Morph はクラスですが、自身もインスタンスです。属するクラスは無名ですが、
便宜的に Morph class と呼称します。いわゆるメタクラスというやつです。
メタクラスのスーパークラスパスは、原則としてそのインスタンスである
クラスのスーパークラスパスと同じです。したがって、Morph class の
スーパークラスをたどると ProtoObject class に行き着きます。
ProtoObject class は ProtoObject と違って、さらにスーパークラスがあります。
それが、Class です。そこからは普通に ClassDescription、Behavior とたどることができます。
| superclass |
World findATranscript: nil.
superclass := Morph class superclass.
[superclass isNil] whileFalse: [
Transcript cr; show: superclass.
superclass := superclass superclass]
余談ですが、このスクリプトの全角スペースをタブに置き換えるには、
最初の全角スペースを削除してタブをタイプした後、alt + shift + j としてみてください。
again という機能です。