Python入門 - 継承と包含 考え方編
継承とは?
あるクラスの特性(つまり、データや機能)を別のクラスに引き継がせることを「継承(英語でインヘリタンス)」と言います。
例えば、「動物」を考えてみましょう。一口に「動物」といっても、その中には「人」もあれば、「魚」もあります。他にも「犬」や「鳥」もあるでしょう。この時、「人」や「魚」は別のクラスだと言えますが、どちらも「動物」の一種です。例えば「動物」は「ものを食べる」という機能を持っています。「人」も「魚」も「ものを食べる」生き物ですが、これは「人」も「魚」も、どちらも「動物」だからですね。
この「BはAである(B is a A)」という関係を「is-a」関係と言います。
「is-a」関係をプログラム上で表現したものが、継承です。つまり、「動物」クラスを継承して「人」クラスを作成するということです。この時、軽傷元である「動物」クラスを「親クラス(スーパークラス)」といい、軽傷先である「人」クラスを「子クラス(サブクラス)」と言います。
継承は便利な機能で、オブジェクト指向プログラミングの大事な要素ですが、上手に使わないと、とてもわかりにくいプログラムになってしまいます。継承は、クラスとクラスの間に強い「依存関係」を作るからです。継承は明確な「is-a」関係がある時に、継承すべきかどうか考えるようにしましょう。
また、次に呼べる「包含」を利用すべきではないかも一緒に考えましょう。
包含とは?
先ほどの「動物」の例えを使ってもう少し考えてみましょう。他にも「人」や「魚」、「鳥」に共通する要素はないでしょうか?割とたくさん思いつくのではないでしょうか?例えば、「骨」とか「脳」とか「筋肉」は共通していそうですよね。では、「人」は「骨」を継承すべきなのでしょうか?
先ほどの継承でも説明しましたが、継承は「is-a」関係の時に使うものです。「人は骨である」と言えるかどうか考えるわけです。考えるまでもなく、答えはノーです。
しかし、「骨は人の一部である」とか「魚は骨を持っている」とかいうことはできそうです。このように「BはAを持っている(含んでいる)」というような関係を包含関係とか「has-a」関係などと言います。
包含でも、クラスAの特性をクラスBで利用することができます。しかし、クラス間の依存度は、継承に比べれば小さいです。
具体的な使い方は、次の記事で説明したいと思います。