オブジェクト指向型のプログラミング言語を扱っていると、「継承」という操作が出てきます。
以下から クラスの継承とは何か? という話を解説していきます。
そもそもオブジェクト指向やクラスとは何か? という話について詳しくはこちら。
目次
クラスの継承とは?
「継承」は、あるクラスの機能を引き継いで、新しいクラスを作成することです。
例えば「トラック」と「バス」クラスを作成する例で考えてみます。
それぞれのクラスでは、「残りの燃料」や「走行距離」といった属性(プロパティ)を持っていることや、「走る」「ガソリンを入れる」などの操作(メソッド)は共通しています。このような場合に「継承」が使えます。
具体的に言うと、新しく「車」クラスを作成し、その中に共通する属性や操作を書きます。そして、「トラック」と「バス」クラスは「車」クラスの機能を引き継いで作成します。
継承元のクラス(今回の場合は「車」クラス)は「スーパークラス」、継承先のクラス(今回の場合は「トラック」と「バス」クラス)は「サブクラス」と呼ばれています。
「スーパークラス」-「サブクラス」以外に、「基底クラス」-「派生クラス」、「親クラス」-「子クラス」と呼ばれることもあります。
「継承」のメリット
もし「継承」という概念が用意されていない場合は、新しくブレーキの機能を追加したいとなったときに、乗り物に関する個別のクラスそれぞれに属性や操作を追加する必要があります。
こうしてしまうとコードが冗長になり、乗り物のクラス全体に機能を追加したり 修正したりするときに、ひとつひとつのクラスを修正する必要が出てきてしまいます。
また、「車」クラスのように基盤となるクラスを置いておくことで、「ダンプカー」クラスのような新たな乗り物を最小限の手間で作成することが可能となります。
まとめると、継承を用いることで、コードの追加・修正といったメンテナンスが容易になります。また、より抽象的な共通する機能をまとめておくことで、コードが読みやすくなったり、既存のコードを使いまわしやすくなったりします。
継承のルール
細かい挙動はプログラミング言語によって違いますが、ここでは継承の一般的な特徴をまとめていきます。
Ruby で実際に継承を行なっているプログラムはこちら。
サブクラスへメソッドを追加して拡張できる
サブクラスには、スーパークラスにはない新たなメソッドを追加することができます。これでサブクラスでは、スーパークラスのメソッドだけでなく、新たに追加したメソッドも使えるようになります。
例えば、「走る」というメソッドを持つ「車」クラスを継承して「トラック」クラスを作成したとします。そして「トラック」クラスに新しく「荷物を載せる」メソッドを追加しました。
すると「トラック」クラスでは、「走る」と「荷物を載せる」メソッドが使えるようになります。
スーパークラスのメソッドを上書き(オーバーライド)できる
サブクラスでは、スーパークラスのメソッドを上書きして定義し直すことができます。これをオーバーライドと言います。
例えば、「走る」というメソッドを持つ「車」クラスを継承して「トラック」クラスを作成したとします。そして「トラック」クラスでは同じ名前の「走る」メソッドを追加(オーバーライド)しました。
すると「トラック」クラスの「走る」メソッドを呼び出したときは、上書きした「トラック」クラスの処理が実行されます。
また、スーパークラスのメソッドの処理を、オーバーライドしたメソッドに取り込んで、そこに新しい処理を加えることもできます。
スーパークラスは1つまで
Ruby や Java では、継承できるクラス(スーパークラス)は1つまでです。複数のクラスを継承して新しいクラスを作成することはできません。
Python や C++ といった多重継承ができる言語も存在していますが、プログラムが複雑になるため、使わないようにするケースも多いです。
まとめ
以上、クラスの継承についての解説でした!
ここまでの内容をまとめておきます。
- 「継承」は、あるクラスの機能を引き継いで、新しいクラスを作成すること。
- 継承元のクラスは「スーパークラス」、継承先のクラスは「サブクラス」と呼ばれる。
- 継承を用いることで、コードの追加・修正といったメンテナンスが容易になったり、より抽象的な共通する機能をまとめておけるので、コードが読みやすくなったり、既存のコードを使いまわしやすくなったりするメリットがある。
- サブクラスにメソッドを追加することで、スーパークラスにはない機能を拡張できる。
- サブクラスでは、スーパークラスにあるメソッドと同じ名前のメソッドを作成(オーバーライド)することで、スーパークラスのメソッドを上書きして定義し直すことができる。
- Ruby や Java では、継承できるクラス(スーパークラス)は1つまで。