is-a関係とhas-a関係を整理

オブジェクト指向において、ほかのオブジェクトとの関係性を見極めるときに使われるのが「is-a関係」と「has-a関係」と呼ばれる言葉について紹介します。この言葉はオブジェクト指向において、多彩なオブジェクトが乱立する環境を俯瞰してオブジェクト間の関連性を見極めるのに使用されます。

主に「継承」と「コンポジション」の話になりますが、これらはオブジェクト指向プログラミングを行っていく中で知っておくべきワードでもありますので、ここでいったん取り上げたいと考えていました。

is-a関係は「継承」

「is-a関係」は「分類」に相当します。英語でisを直訳すると「~であること」や「~である」という意味になります。例えば「人間は動物である」や「バスは車である」というような言い方ができますよね。「〇〇は〇〇である」「〇〇は〇〇の一種である」というのは、「分類」に相当し、オブジェクト指向において分類を表すのは「継承」にほかなりません。

継承は一つしか行うことができませんので注意が必要です。プログラミングにおいて「分類」は複数から受け継ぐものではなく、特定のオブジェクトから直系として機能を受け継ぐこととなります。

分類というのはオブジェクトの所属先を示す言葉であり、様々なオブジェクトが群を成して一つの「グループ」として語られるときに使われます。とある思想(オブジェクト)を起点として「~の一種である」というのは、たくさんのオブジェクトをグルーピングするのに役立ちます。

has-a関係は「コンポジション」

オブジェクト指向において「is-a」と並んでよく出てくるのが「has-a関係」というものです。hasは英語で直訳すると「~を持っている」と訳されますが、オブジェクト指向における「has」が意味するのは「機能」です。これまで出てきた内容でいうと「インターフェース」になりますね。

「has-a関係」として重要なのは継承と異なり複数を持つことができるということです。「is-a」は「オブジェクト自身」が属するモノを指していますが、「has-a」は「オブジェクトが何を持っているか」という「オブジェクトの中身」を示しています。

こうした「オブジェクトの中身」を指す単語に「コンポジション」があります。コンポジションは直訳すると「構成」を意味します。オブジェクトがどのような「構成」となっているかを示すのが「has-a」だと覚えておきましょう。例えば「人間は歩く、走る、掴むなどの機能を持っている」というような感じですね。

is-aとhas-aの違い

オブジェクト指向においてよく出てくるワードとして「is-a」と「has-a」について解説しました。結論からいうと「is-a」は「継承」であり「has-a」は「コンポジション」です。「継承」は特定のオブジェクトがどういう特性を持っているかの分類ですが、「コンポジション」はオブジェクトがどのような構成担っているかを示します。

オブジェクト指向は主にクラスなどを駆使して、様々な特性を有するオブジェクトを作りながら、それらを組み合わせてアプリケーションを組み立てていく手法を指しています。その中で作成される「オブジェクト」を説明するために発生したものが「is-a」「has-a」であると考えています。

オブジェクト指向を駆使してアプリケーションを組み立てる時は、あまり気にすることはないのかもしれませんが、様々なオブジェクトを俯瞰して考えるときに重要な指標となります。オブジェクト同士の関係性を明確化したい場合に、こうした単語を知っておくとオブジェクトへの理解が進むはずです。