クラスの集合論
サブクラスを「部分クラス」と訳してある本を見て、はじめ違和感がありました。
だって、サブクラスっていうのは、スーパークラスがまずあって、その上に新たなフィールドやメソッドを実装したりしたものじゃないですか。
サブクラスの一部を取り出すとスーパークラスができる。
つまり、「部分」というならスーパークラスの方こそ部分じゃないのか?、と思ったわけです(下図のイメージ)
┌───────┐ ┌──────┐ │スーパークラス│ │サブクラス │ ├───────┤ ├──────┤ │a │ │a │ │b │ │b │ ├───────┤ │c │ │d() │ ├──────┤ └───────┘ │d() │ │e() │ └──────┘
ではサブクラスの一体何が部分だというのか。
そのヒントは、「型=値の集合」という概念にあります。
クラスも型だと思えば、「クラス=オブジェクトの集合」と考えられます。
で、クラスを集合として見れば、
obj ∈ Subclass ⇒ obj ∈ Superclass ('∈'は instance of)
サブクラスは見事にスーパークラスの部分集合になっているわけです。
「サブクラスのインスタンスをスーパークラスのインスタンスとして扱える」だとか「全てのオブジェクトはObjectクラスのインスタンスである」とかその辺の話は全て集合論で扱えます。
「部分クラス」というのは、
構造的に部分というわけではなく、集合として部分である
という意味なのです。
そう考えると、Rubyで継承を宣言する記号"<"がUMLの矢印と逆向きだなー、なんて気持ち悪く思っていた部分も
class Subclass < Superclass
これは矢印ではなく、文字通り「小なり」だと思えばいいんですね。
集合における順序関係とはすなわち包含関係なので。(半順序ですが)
こんな風に、「クラス=オブジェクトの集合」と考えるといろいろ新鮮な発見がありました。