以前書いたエントリで、「集合の集合」がよくわかんねぇ、とか言ってた。
で、いろいろな方からヒントを頂いて、正直なところ、「あれ? 俺が悩んでたのはそんなことだったんだっけ?」と思った。
で、昨日のエントリを書いたことで、当初の疑問を思い出した。
クラスとは、インスタンスの集合であるとする。
派生クラスとは、基底クラスの部分集合であるとする。
クラスの継承関係は、基本的には抽象度に着目して行うべきだ。
基底クラスは派生クラスよりも情報量が少なく、抽象度が高い。
これは、別の言い方をすれば「内包が小さく、外延が大きい」とも言う。
では、クラスとインスタンスの関係はどうか?
クラスとインスタンスの関係も、抽象度の違いがあるはずだ。
よく使われるたとえ話に「犬クラスと、そのインスタンスであるポチ」がある。
犬クラスは、個々の犬の名前を捨象している。
ここで「ポチクラスを作ろう」というのではない。逆だ。
昨日の話では、XMLクラスの派生クラスとしてXHTMLやXAMLを置き、そのインスタンスとして、それらの言語で書かれた文書を挙げた。
だが、XHTMLやXAMLといった言語を、XMLクラスのインスタンスとしてもよかったのではないか? と思うわけだ。
そうしたとき、個別言語は、XMLクラスのインスタンスであると同時に、各文書のクラスでもある。
集合論の言い方をすれば、XMLクラスは「クラスの集合」であり、「集合の集合」であることになる。
現在、主流のオブジェクト指向言語では、クラスのクラスを記述できない。
Java の ClassLoader とか .NET の System.Type は、ある意味で「クラスのクラス」だが、XML の例とは抽象化の方向性が違うように思う。
うまくまとまらない。むーん。