オブジェクト指向プログラミングはポリモーフィズムから学べ(2) ~クラス導入編 前編~

今シリーズのまとめ

  1. オブジェクト指向プログラミングはポリモーフィズムから学べ

  2. 本記事

  3. オブジェクト指向プログラミングはポリモーフィズムから学べ(2) ~クラス導入編 後編〜

  4. オブジェクト指向プログラミングはポリモーフィズムから学べ(3) ~カプセル化,継承~

はじめに

前回ポリモーフィズムを紹介しましたが、今回はクラスを導入するところから始めます。
正直難産でした。クラスは型を持った集合だよと言いたいだけのクラス編なのに、どこから話を始めればいいのか、天地開闢から?それとも何も歴史を語らなくてもいい?みたいなぐるぐるし始めてようやくたどり着いたのが、以下に続くラッセルの集合論の話です。

クラス

ラッセルの頃の集合の呼び方

現代数学で定義されている難しいものでなく、今回導入に使いたいのは、ラッセルがプリンキピア・マテマティカでした定義です。クラスとは要は集合です。いつから集合はSetsになったかまでは勉強できませんでしたが、20世紀の前半はclassと呼ばれていました。classはclassのclassも作れます。すもももももももものうちという感じですね。

ラッセルの型を導入した集合論

ただラッセルがプリンキピア・マテマティカで定義したclassはラッセルの定義した型理論に従います。型理論とはですが、「この文は偽である」というような文の真偽は決定できず、パラドックスになっているのですが、こういう文を作れなくするために、集合を型というものでグループ分けします。
命題「Aは偽である」の述語「Xは偽である」をタイプ1の型を持つ集合1、項「A」をタイプ0の型を持つ集合2ととする。集合1に集合1を適用する命題こそ「この文は偽である」という文と同値ですが、型理論ではタイプ1の型をもつ集合は1より小さいタイプ0の型をもつ集合2を含むことはできるが、同じ数以上のレベルを持つ型の集合1を含むことを許しません。なので、めでたく「この文は偽である」は型理論の下では成立しません。ゆえにパラドックスを起こす文を考える必要がありません。
詳しくは

を参考にしてください。
レベルが低い型がレベルの高い型に含まれないのは、関数の引数が整数型で定義してあれば、関数を引数に代入できないのと同じですね。ここでプログラミングの話に戻りますが、関数も関数型という型と考え(実際関数型がある言語もある)、タイプ1に属するとします、また整数型をタイプ0に属すると考えると型理論の考え方が結構そのまま応用できます。

そして型とclassはプログラミングへ

型のある集合としてのclassを集合として考えると、いろいろ説明しやすく習います。前述したようにclassは集合でclassを要素にもてます。また型がある。これはオブジェクト指向で言われるクラスです。違いはメソッドが歩かないかです。集合に代数的構造を与えるのは群論で、後編で群論について話したいと思います。

オブジェクト指向におけるクラス

改めてまとめるとラッセルによってまとめられた型理論の考え方、またそれを引き継いだ理論を計算機科学が受け継いでいるので、やっぱりオブジェクト指向も型理論の影響下にあります。
型理論の集合論では集合は集合を持ち、型を持つ。そしてこれはしっかりオブジェクト指向に継承されている。つまり、オブジェクト指向のクラスとは型があり、集合を要素にもてる集合だということです。

終わりに

書いていて、本当にどこから始まり、どこにたどり着くかよくわからなくて結構大変でした。クラスは集合だということが言えればそれだけでいいという一番書きたいことにたどり着いたので、いったん区切りをつけて後編に続きます。できれば後編も読んでいただきたいです。

オブジェクト指向プログラミングはポリモーフィズムから学べ(2) ~クラス導入編 後編〜

いいなと思ったら応援しよう!