どうも、とがみんです。
以前の記事で、オブジェクト指向プログラミングについて説明しました。
今回の記事では、オブジェクト指向プログラミングの要素の1つである「継承」というものについて紹介していきます。
継承とは
「継承」とは、継承元の設計図(クラス)の属性(プロパティ)、動作(メソッド)を継承先のクラスに引き継ぐ事です。
「継承」をすることによって、継承元(親クラス)のあらゆる情報を継承先(子)に引き継ぐことができます。
例えば、救急車クラスを作成したいとします。
以下のように「車クラス」があり、「救急車クラス」にそれを継承することによって、「救急車」クラスに直接書かれていないプロパティやメソッドを使用することができます。
「救急車の設計図」には、「タイヤ」や「エンジン」といったプロパティ「走る」や「止まる」といったメソッドが書かれていませんが、
継承元の「車の設計図」にはそれが書かれているので、救急車の設計図からインスタンス化したオブジェクトもそれらのプロパティを持ち、メソッドも扱うことができます。
救急車は「走る」ことができます。
このように、継承することによって、継承先のクラスから作成されるオブジェクトは、継承元のクラスが持つプロパティを持ち、そのメソッドを扱うことができるようになります。
Swiftで上記の図の状態をコードで書くと、以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | //車クラス class Car{ var engin = "エンジン" var tireNum = 4//タイヤの数 func run(){ print("走る") } func stop(){ print("止まる") } } //救急車のクラス class Ambulance:Car{//Carクラスを継承している。 var siren = "サイレン" func sirenOn(){ print("サイレンを鳴らす") } func sirenOff(){ print("サイレンを止める") } } |
継承のメリット
継承のメリットは以下の2つあります。
- プログラムを書く量を減らせる
- 仕様変更の際、変更箇所を減らせる
それぞれについて説明していきます。
プログラムを書く量を減らすことができる
クラスを継承する事によって、プログラムを書く量を減らす事ができます。
例えば、車100台のオブジェクトを作らないといけない。しかも、バスや救急車、その他いろんな種類の車があるといった状況を思い浮かべてください。
それぞれ一台一台設計図を書いて行くと非常に手間がかかります。
例えば、「救急車」「バス」「トラック」の設計図を書くとします。
それらをそのまま書くと、以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | //救急車クラス class Ambulance{ var siren = "サイレン" var engin = "エンジン" var tireNum = 4//タイヤの数 func sirenOn(){ print("サイレンを鳴らす") } func sirenOff(){ print("サイレンを止める") } func run(){ print("走る") } func stop(){ print("止まる") } } //バスクラス class Bus{ var hakkenki = "発券機" var engin = "エンジン" var tireNum = 4//タイヤの数 func makeTicket(){ print("チケットを発行") } func run(){ print("走る") } func stop(){ print("止まる") } } //トラッククラス class Truck{ var nidai = "荷台" var engin = "エンジン" var tireNum = 4//タイヤの数 func openNidai(){ print("荷台を開ける") } func run(){ print("走る") } func stop(){ print("止まる") } } |
それら全ては「車」であるので、それぞれには共通した部分があります。
この共通部分を抜き出し、「車クラス」として作成し、「継承」します。
継承することによって、上記のコードを、以下のように書き換えることができます。
共通部分をまとめた車クラス
1 2 3 4 5 6 7 8 9 10 11 | //車クラス class Car{ var engin = "エンジン" var tireNum = 4//タイヤの数 func run(){ print("走る") } func stop(){ print("止まる") } } |
車クラスを継承することで、「救急車クラス」、「バスクラス」、「トラッククラス」を書いたものが以下です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | //「車クラス」を継承して書いた「救急車クラス」 class Ambulance:Car{ var siren = "サイレン" func sirenOn(){ print("サイレンを鳴らす") } func sirenOff(){ print("サイレンを止める") } } //「車クラス」を継承して書いた「バスクラス」 class Bus:Car{ var chair = 60 var hakkennki = "発券機" func makeTicket(){ print("チケットを発行") } } //「車クラス」を継承して書いた「トラッククラス」 class Truck:Car{ var nidai = "荷台" func openNidai(){ print("荷台を開ける") } } |
このように、共通部分をまとめて、それを継承することによって、同じコードを何度も書く必要がなくなるので、コードの量を減らすことができます。
コードを書く量が減れば、それだけ、コードが読みやすくなり、可読性も上がります。
使用変更の際、変更箇所を減らせる
2つ目のメリットとして、使用変更があった際に変更箇所を減らし、手間を省けるといったメリットがあります。
例えば、すべての車の「エンジン」を「新型高性能エンジン」に変更したいと考えます。
共通項を抜き出し、継承していなかった場合は、全ての設計図に対して変更を加えないといけないですが、
継承していた場合、「車クラス」の「エンジン」の部分を「新型高性能エンジン」に書き換えるだけですみます。
このように、共通部分を抜き出したクラスをあらかじめ作り、それを継承する事で、仕様変更があった場合に、変更箇所を減らす事ができます。
まとめ
オブジェクト指向プログラミングにおける「継承」について説明しました。
以下にこの記事の要点をまとめます。
「継承」とは、継承元の設計図の属性、動作を継承先のクラスに引き継ぐ事。
そのメリットは、
- プログラムを書く量を減らせる
- 使用変更の際変更箇所を減らせる
はい。