ObjectSquare [1999 年 4 月号]

[Happy Squeaking!!]


5.Squeak演習: インターセッション

5.4 メタクラスの継承関係


Accountメタクラスでの例

「クラスに属性、操作が持てるということは…」となると次に出てくるのが継承です。実はクラスと同様に、メタクラスにも継承関係はあります。

Accountクラスの継承関係は次のようになっています。

"print it"
Account printHierarchy. 
'
Object ()

        Account (''id'' ''money'' )'

次にAccoutメタクラスの継承関係をみてみましょう。

"print it"
Account class printHierarchy.

以下のような文字列が得られます。

'
Object ()
        Behavior (''superclass'' ''methodDict'' ''format'' ''subclasses'' )
                ClassDescription (''instanceVariables'' ''organization'' )
                        Class (''name'' ''classPool'' ''sharedPools'' )
                                Object class ()

                                        Account class (''idCount'' )'

非常に複雑で、驚いてしまいます。Behavior、ClassDescription、Classとは一体何なのでしょうか。

ここで視点を変えてトップダウン的に、概念的に考えてみましょう。生物の誕生、進化過程のように、Smalltalk世界が生まれ、発展していった流れを追うことにします。

Smalltalkの世界では、Objectという存在が、すべての世界の根元になっているとしています。「最初にObjectありき」です。Objectは、いわば究極の抽象物で、もやもやとしたつかみ所のない、「もの」であったと考えてみてください。

ちなみに,通常のオブジェクトと混同しないようにこの究極のObjectはSmalltalkコミュニティでは伝統的に「ラージオブジェクト」と呼び習わされています.

この「もの」が発展して、振る舞いを持つように拡張された「もの」がBehavior(「振舞いをもつもの」)です。さらに、属性の値が持てるように拡張したものが、ClassDescription(「クラスのようなもの」)なのです。

「Classのようなもの」は実はSmalltalkでは2種類あります。Class(「インスタンスを分類するもの」)と、Metaclass(「クラスを分類するもの」)です。

ここまでをまとめると以下のような概念図になります。

今度はボトムアップ的に考えます。

Account、OrderedCollectionなど、それぞれのクラスは、自分の存在の基盤として、自分用のメタクラス 、(Account class、OrderedCollection class)とつながっています。

メタクラスから見た場合には、Account classは、Accountの設計図を持つ工場として、Accountを生成したと考えることができます。

Accountクラスが2つ以上存在しても、意味がありません(Accountクラスが2つあってもどちらを使っていいか不明)ので、通常Accountメタクラス(Account class)はたった一つのAccountクラスしか生成しません。

クラスの継承関係を辿っていくと、ルートはObjectになります。

こうしたクラスを影で支えるメタクラス達はやはりパラレルな継承関係を持つことになります。

ここで先ほどのトップダウンの図とつなげてみます。

Object、Accountは、全てClassのインスタンス、
Object class、Account classなどは、全てMetaclassのインスタンス、
と、それぞれ考えることができます。

ただし、Classに関しては、Classが直接に、ObjectやAccountを生成しているわけではありません。(図において生成の矢印が重複してしまっています)。実際にはObject classやAcocunt classが、それらの役目を担っています。ということは、Classは実は個々の 〜 classを取りまとめる抽象クラスだったことがわかります。

トップダウン的に考えてきたClassやMetaclassもやはりそれを支えるメタクラスがあります。

拡大図(GIF, 4KB)
拡大図

先ほどのBehaviorやClassDescriptionも同様です。

拡大図(GIF, 7KB)拡大図

ようやくトップダウンの階層とボトムアップの階層とが完全につながりました。(図では一部、生成、メタの矢印が省略されています)。
Objectが二箇所で出てきますが、実際には同一のものになり、全てがObjectからはじまる世界が構築されたことになります。

これで先ほどのメタクラス階層の表示が納得できるようになったかと思います。
Object、Behavior、ClassDescription、Class、Object class、Account classと続くことになります。

Classのサブクラスに、メタクラスのインスタンス(Object class、Account classなど)が来ることに疑問を思われるかもしれません。しかし、メタクラスにクラスの属性や操作が定義できるということは、メタクラス間でも適切な継承関係が存在しなければならないことになります。newのオーバーライドができるのは、この〜 classの継承関係のためなのです。メタクラスのインスタンス達は、それぞれのクラス定義(Accountなど)用にカスタマイズされたClassの一種ということになります。

Metaclassのインスタンス(〜 class)が、同時にClassのサブクラスになるという関係は実はそれほど珍しいものでもありません。このように、特定クラスAのインスタンスが、また別のクラスPのサブクラスになるという関係がある場合、そのクラスPはクラスAのパワータイプ(べき型)であるといわれます。オブジェクト指向の分析で重要な概念ですが、今回は範囲外です。

更につづく


© 1999-2001 OGIS-RI Co., Ltd.

Prev.

Index

Next