クラスの集合論

今回は関数型言語ではなく、オブジェクト指向の話。

サブクラスを「部分クラス」と訳してある本を見て、はじめ違和感がありました。
だって、サブクラスっていうのは、スーパークラスがまずあって、その上に新たなフィールドやメソッドを実装したりしたものじゃないですか。

サブクラスの一部を取り出すとスーパークラスができる。
つまり、「部分」というならスーパークラスの方こそ部分じゃないのか?、と思ったわけです(下図のイメージ)

┌───────┐ ┌──────┐
│スーパークラス│ │サブクラス │
├───────┤ ├──────┤
│a       │ │a      │
│b       │ │b      │
├───────┤ │c      │
│d()      │ ├──────┤
└───────┘ │d()     │
          │e()     │
          └──────┘

ではサブクラスの一体何が部分だというのか。

そのヒントは、「型=値の集合」という概念にあります。
クラスも型だと思えば、「クラス=オブジェクトの集合」と考えられます。
で、クラスを集合として見れば、

obj ∈ Subclass ⇒ obj ∈ Superclass  ('∈'は instance of)

サブクラスは見事にスーパークラスの部分集合になっているわけです。

「サブクラスのインスタンススーパークラスインスタンスとして扱える」だとか「全てのオブジェクトはObjectクラスのインスタンスである」とかその辺の話は全て集合論で扱えます。


「部分クラス」というのは、
 構造的に部分というわけではなく、集合として部分である
という意味なのです。


そう考えると、Rubyで継承を宣言する記号"<"がUMLの矢印と逆向きだなー、なんて気持ち悪く思っていた部分も

class Subclass < Superclass

これは矢印ではなく、文字通り「小なり」だと思えばいいんですね。
集合における順序関係とはすなわち包含関係なので。(半順序ですが)

こんな風に、「クラス=オブジェクトの集合」と考えるといろいろ新鮮な発見がありました。