どうも!インストラクターの佐野です。
前回の記事では「クラス」「メソッドやインスタンスの関係」を学びました。
今回はクラスと同じくオブジェクト指向の基本的な概念「継承」について解説します。
以前の記事も合わせてご確認下さい。
【第一回】
【第二回】
- 継承はクラス定義の共通部分をまとめたクラスを作っておく仕組み
- 継承を用いればコードの再利用やメソッドのオーバーライドが可能
- 継承はプログラミングの効率向上が期待できる手段
継承とは?
定義
まずはWikipediaの解説を読んでみましょう!
継承(けいしょう、inheritance:インヘリタンス)とはオブジェクト指向を構成する概念の一つである。
あるオブジェクトが他のオブジェクトの特性を引き継ぐ場合、両者の間に「継承関係」があると言われる。
一般的に、BがAを継承する場合、B is a A. (BはAの一種である)という意味的な関係(Is-a関係)が成り立つ。
従って、同じふるまいを持つからと言って、意味的に無関係なクラス間に継承関係を持たせるのは適切でない場合が多い。
ちょっと難しいですね!
オブジェクト指向は抽象的な概念なので、具体的に例をあげて解説した方がわかりやすいでしょう。
具体的にいうと、「継承」とは、クラス定義の共通部分を別クラスにまとめる仕組みのことをいいます。
継承はクラス定義の共通部分を別クラスにまとめる仕組み
継承は、既存のクラスから、新しく作ったクラスに「変数定義」や「メソッド」などを引き継ぐことです。
継承される既存のクラスを「スーパークラス(親クラス)」、継承した新しく作ったクラスを「サブクラス」といいます。
しかし、そういわれてもスーパクラスを引き継ぐことでどんなメリットがあるのか、なぜ継承を使う必要があるのかがよくわからないでしょう。
継承にはどんなメリットがあるのか、なぜ継承を使うのかを解説していきます。
なぜ継承を使うのか?
実は、継承を使わずにプログラミングを行うことは可能ですし、使わなければプログラミングができないといったわけではありません。
継承を使わなくても問題はなさそうに思えます。
それなのに、なぜ継承を使うのでしょうか?
それは継承が、「コードの再利用性」や「拡張性」を高めるための有効な手段となるからです。
プログラムが大規模になってくると、コードが見づらくなったり、読みづらくなったりします。
その原因の1つは、同じような機能をもつ重複したコードを書いてしまうからです。
重複したコードを書くことによって勘違いやミスが増え、思わぬバグやトラブルを起こしてしまう可能性があり、メンテンスが難しくなります。
また、メンテナンスが難しくなることによって、「機能の追加」や「改善」が難しくなり拡張性が下がってしまいます。
効率よく少ないコードでプログラミングしないと、開発がどんどん難しくなり、コードを書くプログラマーも苦しくなってくるのです。
これはパッと聞いてもイメージが湧かないと思いますので、どのように継承を使うのか具体例をもとに解説していきます。
どのように継承を使うのか?
コードの再利用
継承を用いる場合は、「骨組み」となるクラスを1つ作り、その1つのクラスを継承するのが一般的です。
具体例では、「RPGのキャラクター」があります。
「初期のキャラクター」を「スーパークラス」として、継承して「戦士クラス」とか「魔法使いクラス」などを作るイメージです。
そうすることで、戦士であれば剣を使う部分だけ、魔法使いであれば魔法を使う部分だけ、つまり必要最低限のコードを追加するだけでプログラミングができてしまうのです。
メソッドのオーバーライド
継承したサブクラスでは、スーパークラスのメソッドを使うことができます。
新しく追加して機能を追加することもできますが、実はスーパークラスのメソッドを「上書き」することもできます。
スーパクラスのメソッドをサブクラスで上書きすることを「オーバーライド」といいます。
このオーバーライドが継承を使う上でもっとも重要な機能となります。
具体例をあげると、オーバーライドはRPGのキャラクターが行う特定のアクションを上書きする場合によく使います。
攻撃する処理を書いたメソッドをオーバーライドし、「忍者は通常攻撃で一定確率で即死攻撃」、「白魔道士は攻撃で回復を行う」といった具合で上書きするようなイメージです。
これも「一定確率で即死」「回復する」などの違う部分だけをプログラミングするだけで済みますし、同じメソッドを使っても実行するクラスによって違う動作を行うようにできます。
こちらの方が効率よくプログラミングすることができますね!
まとめ
継承は
- コードの重複を減らしてコードの再利用性を高める
- メソッドを追加したり、オーバライドすることで自由に拡張する
の2点を実現し、プログライミングの効率をあげる手段です。
オブジェクト指向は実際にプログラミングしてみないと便利さを実感できないので、理解するには時間がかかります。
しかし、クラスと継承で共通していることは2つとも「プログラミングの効率をあげること」を目的としています。
オブジェクト指向は「プログラミングの効率をあげる考え方の1つ」だと思っていただければいいでしょう。
次回はオブジェクト指向の3つ目の概念「ポリモーフィズム」について説明していく予定です。
はたして、ポリモーフィズムとはどんな風にプログラミングの効率をあげるものなのでしょうか。
どうぞ、お楽しみに!