オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也 オブジェクト指向言語の基本概念 1. カプセル化 2. 3. データ構造とアルゴリズムの一体化 ⇒ クラス フィールドとメソッド クラスとインスタンス 継承 多相性(ポリモルフィズム) 多相性とは? 継承を用いることで,既存クラスを再利用(拡張)して 容易に新しいクラスを作成することができる. しかし,作成した新しいクラスはそのままでは利用され ることはない. 勝手に作成したクラスのメソッドを誰も呼び出してくれない. 例) 既存クラスAとBがあって,AがBを利用(呼び出し)しているとする. Bを拡張して新しいクラスB2を作成する. 既存クラスのAは新しくB2が作成されたことを知らない. B2を使ってもらうためには,既存クラスAも書き換える必要がある. ⇒新たにB2を作成したときに他のクラスをあまり書き換えたくない. 多相性:拡張に伴う書き換えを最小限にする仕組み. 多相性の例(1/4) Personの子ク ラス(Teacher クラス)をもう一 つ作成. public class Teacher extends Person { String title; // 役職 String getTitle() { return title; } void setTitle(String t) { title = t; } } Person クラスを 拡張して 作成する 多相性の例(2/4) Personにメソッ ドを追加. Studentおよび Teacherで そのメソッドを オーバーライド オーバーライド public class Person { : void goToLecture(String lecture) { System.out.println(lecture + "を受講できない"); } } public class Student extends Person { : void goToLecture(String lecture) { System.out.println(lecture + "を受講する"); } } public class Teacher extends Person { : void goToLecture(String lecture) { System.out.println(lecture + "を講義する"); } } 多相性の例(3/4) 各クラスの新し いメソッドを呼び 出してみる. ここまでは,た だの継承. public static void main(String[] args) { Person p = new Person(); Student s = new Student(); Teacher t = new Teacher(); p.goToLecture("オブジェクト指向プログラミング"); s.goToLecture("オブジェクト指向プログラミング"); t.goToLecture("オブジェクト指向プログラミング"); } 多相性の例(4/4) public static void main(String[] args) { Person p = new Person(); Person s = new Student(); Person t = new Teacher(); p.goToLecture("オブジェクト指向プログラミング"); s.goToLecture("オブジェクト指向プログラミング"); t.goToLecture("オブジェクト指向プログラミング"); } 子クラスのイン スタンスを親ク ラスの変数に代 入できる. 見た目の型は 親クラス,中身 見た目(変数)の型をPersonに は子クラスのイ 「見た目は大人,頭脳は子供?」 ンスタンス. 中身の型に応じ てメソッドが呼び 出される. 多相性の利点(1/3) 異なる型のイ ンスタンスをま とめて処理でき る. public static void main(String[] args) { Person p[] = new Person[3]; p[0] = new Person(); Person型の配列 p[1] = new Student(); を宣言 p[2] = new Teacher(); goToLectureTogether(p, "オブジェクト指向プログラミング"); } public static void goToLectureTogether( Person p[], String lecture) { for (int n = 0; n < p.length; n++) { p[n].goToLecture(lecture); } } 同じ実行文で異なる型を処理できる (見た目の型はPerson) 多相性の利点(2/3) 新しい子クラス を作成して拡 張してみると… public class Staff extends Person { void goToLecture(String lecture) { System.out.println(lecture + "を見学する"); } } オーバーライド 多相性の利点(3/3) 新しいクラスを 追加してもプロ グラムの書き 換えを最小限 にできる. プログラムの書き 換えは不要! public static void main(String[] args) { Person p[] = new Person[4]; p[0] = new Person(); p[1] = new Student(); 新しいクラスの p[2] = new Teacher(); インスタンス p[3] = new Staff(); goToLectureTogether(p, "オブジェクト指向プログラミング"); } public static void goToLectureTogether( Person p[], String lecture) { for (int n = 0; n < p.length; n++) { p[n].goToLecture(lecture); } } 多相性のまとめ 継承による拡張性,再利用性の向上をさらに推し進 めるもの. 拡張した時のプログラムの書き換えを最小限にする ことができる. 後に行う拡張が過去に書いたプログラムに影響を与えな いようにする. 過去に書いたプログラムが未来のプログラムを呼び出す ことができる. 多相性をうまく使いこなすには経験と勘が必要. オブジェクト指向設計法.
© Copyright 2024 ExpyDoc