はじめに
今回の記事では、前回までの「クラス」や「インスタンス」の基本をふまえて、オブジェクト指向における「継承」「ポリモーフィズム」「カプセル化」について説明していきます。つまずきやすい部分(実際に筆者がつまずいた部分)を中心に、初心者にもわかりやすく順を追って説明していきます。
もくじ
- はじめに
- もくじ
- オブジェクト指向の3つの要素「継承」「ポリモーフィズム」「カプセル化」
- 家電の例で考えてみよう
- 「継承」って何?
- オーバーライドでメソッドを書き換える
- 「ポリモーフィズム」って何?
- 「カプセル化」って何?
- まとめ
オブジェクト指向の3つの要素「継承」「ポリモーフィズム」「カプセル化」
前回までは、オブジェクト指向という考え方をもとに、その基本である「クラス」「インスタンス」を用いて実際にプログラムを作成しました。今回は、そのオブジェクト指向における重要な3つの要素「継承」「ポリモーフィズム」「カプセル化」の考え方について解説していきます。
オブジェクト指向の考え方に沿って便利な機能を利用するためには、基本となる「クラス」「インスタンス」の理解が必要になります。
家電の例で考えてみよう
オブジェクト指向の3つの要素については、わかりやすく図解できるように例をあげて説明していきます。今回は家電というインスタンスをつくる「家電クラス」をベースにしてみます。
変数には使う電気量、メソッドには「電源ボタンをONにする」「電源ボタンをOFFにする」を定義します。
例:家電クラス
インスタンス変数: 電気量 ・・・作ったインスタンス(家電)によって値が違う
メソッド: 電源ボタンON/電源ボタンOFF ・・・どのインスタンスでも基本的なメソッドは同じ
class HomeAppliance(): # 家電クラス
def __init__(self, elctricity):
self.elctricity = elctricity # 使用電気量のインスタンス変数
def turnon(self): # 電源オンメソッド
print("電源がオンになりました 使用電気量は{}Wです".format(self.elctricity))
def turnoff(self): # 電源オフメソッド
print("電源がオフになりました")
「継承」って何?
クラスを使ってインスタンスを作成していると、インスタンスごとに「別のメソッドを追加できたらな~」というように、カスタマイズしたい場合があります。
例えば、家電クラスに「スマホ遠隔操作」の機能を新しく追加して、遠隔操作機能付き家電クラスを作成したいとします。このような場合に使うのが「継承」という機能です。
継承を使うと、元のクラスに別のメソッドなどを追加して、新しいクラスを作成することができます。また、継承を使って作成したクラスは、元のクラスの機能を受け継ぎます。
つまり上の画像の遠隔機能付き家電クラスでは、元となる家電クラスの機能を使うことができます。
Pythonでは class()のカッコ内に、元になるクラスを書きます。また、大元になるクラスをスーパークラス、受け継いだクラスをサブクラスと呼びます。メソッドなどを増やしたいときに継承を使いますが、継承のメリットは、増やしたい項目だけ記述すれば同じ処理は書かなくてよいというところです。継承はよく使う機能なので、ぜひ覚えてみてください。
class SmartHomeAppliance(HomeAppliance): # 遠隔操作機能付き 家電クラス
def remort_control(self): # 遠隔操作メソッド
print("遠隔操作を開始します")
tv = SmartHomeAppliance(100)
tv.turnon()
tv.remort_control()
継承して作った「遠隔操作機能付き家電クラス」には、「電源オンメソッド」の記述がないにもかかわらず、呼び出して使用することができています。このように継承機能を使えば、記述を省略することが可能です。
「ポリモーフィズム」って何?
家電クラスを継承して、TVクラス・エアコンクラス・電子レンジクラスを作りたいとします。このとき、電源ボタンを押すとTVでは画面が点灯し、エアコンからは冷風が出て、電子レンジからはマイクロ波が出ます。
このとき、TVが「点灯しました」、エアコンが「冷風を送りました」、電子レンジが「マイクロ波を出しました」というふうに実際の動作はバラバラですが、これはTV・エアコン・電子レンジが「動きました」というように共通した名前で表すことができます。
このように、同じ名前のメソッドで異なる動作を実現する考え方をポリモーフィズムといいます。
「ポリモーフィズム」という言葉は和訳すると「多様性」で、これは、一つのメソッドがそれぞれのクラスであらゆる多様性をもつところに表れています。
ポリモーフィズムの考え方では、子クラスのインスタンスで、スーパークラスのメソッドを使うことができます。
この考え方を用いると、例えば家電の種類が洗濯機・・・と増えていっても、ボタンを押せば動くという部分は変わらないので、末端のクラスの動作だけ書き換えればよくなり、プログラムの管理が楽になります。
☆ポリモーフィズムの考え方を実現する「オーバーライド」
上の例で、動かすという部分を「テレビが点く」「冷風を送る」にしたりと、スーパークラスのメソッドの内容をサブクラスで書き換えることをオーバーライドといいます。
スーパークラスで定義されたメソッドを、サブクラスで同名のメソッドとして定義することで上書きすることができます。
class TV(HomeAppliance): # テレビクラス
def turnon(self): # 「電源オン」メソッドの表示を「テレビが点きました」にオーバーライド
print("テレビが点きました")
tv = TV(100)
tv.turnon()
この上書きは、今後アプリケーションなどを作成するときにもよく行うので、ぜひ覚えるようにしましょう!
オブジェクト指向の要素その3 「カプセル化」
オブジェクト指向では現実のモノをプログラムに例えますが、実際に利用する人が知らなくてよいモノ・動作があります。
例えばTVクラスから作ったテレビがあるとします。私たちがテレビを利用するさいには、電源をつける・消すこと、多くてもチャンネルを変えることくらいしか行いません。テレビを使うときには、内部の基盤やLEDの部分を知らないまま使うことができます。中身の詳細を知らなくても、ユーザーが操作できるような形にしておくことをカプセル化といいます。
ここまでは「カプセル化」についての考え方の説明をしました。実際のプログラミングでは、カプセル化とはプログラムを外部から操作できないようにしておくことです。外側から間違えて書き換えができないようにしておくことで、不具合を減らすことができます。
まとめ
オブジェクト指向には「クラス」と「インスタンス」を基本にした3つの要素があり、それぞれ「継承」「ポリモーフィズム」「カプセル化」といいます。継承は、ひとつのクラスから同じ規格を受け継いで新たにクラスつくることをいいます。受け継ぎ元の親のようなクラスをスーパークラス、受け継いだ側のクラスをサブクラスといいます。
ポリモーフィズムとは、同じ名前のメソッドで異なる動作を実現する考え方のことをいいます。これによって、サブクラスが増えそれぞれが別の処理を行っても、スーパークラス側のメソッドの名前を変更することなく対応することができます。
カプセル化とは中身の詳細を知らなくても操作できるような形にしておくことをいいます。実際のプログラムでは、プログラムを外部から操作できないようにしておくことカプセル化といいます。外側から間違えて書き換えができないようにしておくことで、不具合を減らすことができます。
以上の3つの要素を応用することで、大きなプログラムを作成する場合に修正が容易になったり、プログラムを運用していくうえで便利になります。ぜひ少しずつ普段のプログラムに組み込んでみてください。
次回は、オブジェクト指向の3要素を用いてクラスを利用する演習を行う予定です。
ここまで読んでくださってありがとうございました!
コメント