オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也 オブジェクト指向言語の基本概念 1. カプセル化 2. 3. データ構造とアルゴリズムの一体化 ⇒ クラス フィールドとメソッド クラスとインスタンス 継承 多相性(ポリモルフィズム) 継承とは? オブジェクト指向プログラミングとはクラスの作成. 新たにクラスを作成する際に,今までに作成したク ラスを再利用することによって,クラス作成時のプロ グラミングの量を減らすこと(差分プログラミング). ただし,差分プログラミングは近年あまり強調されない. 再利用する既存クラスを親クラス,親クラスを再利 用して新たに作成するクラスを子クラスという. クラスがモノの概念や種類を表すことから,親クラスはよ り一般的な概念,子クラスはより特殊な概念を表すと考え ればよい. 継承の例(1/3) Personは「人」 を表していた. 人のより特殊な 概念として「学 生」を考える. public class Student { String name; double height; double weight; String id; // 学籍番号 int grade; // 学年 Person クラスと 共通 String getID() { return id; } int getGrade() { return grade; } double getBMI() { return weight / (height * height); } } 継承の例(2/3) extendsを用い て親クラスを拡 張して子クラス を作成. 親クラスとの共 通部分を省略で きるのでクラス の作成を効率 化できる. public class Student extends Person { String id; // 学籍番号 int grade; // 学年 String getID() { return id; } int getGrade() { return grade; } } Person クラスを 拡張して 作成する Person クラスとの 共通部分 は省略 継承の例(3/3) main()メソッド内の書き方は親クラスと同様. インスタンスの生成×2 public static void main(String[] args) { Student p1 = new Student(); p1.setHeight(1.7); p1.setWeight(65); setHeight()と Student p2 = new Student(); setWeight()は p2.setHeight(1.6); Studentクラスに p2.setWeight(55); 定義されていない double bmi1 = p1.getBMI(); ことに注意! double bmi2 = p2.getBMI(); System.out.println(bmi1); System.out.println(bmi2); } 継承がある場合のメソッド呼び出し(1/2) デバッガを使って追いかけてみる. public static void main(String[] args) { Student p1 = new Student(); p1.setGrade(1); Personクラスと p1.setHeight(1.7); Studentクラスの p1.setWeight(65); いずれが呼び出さ Student p2 = new Student(); れるか? p2.setGrade(2); p2.setHeight(1.6); p2.setWeight(55); double bmi1 = p1.getBMI(); double bmi2 = p2.getBMI(); int grade1 = p1.getGrade(); int grade2 = p2.getGrade(); System.out.println(grade1 + "," + bmi1); System.out.println(grade2 + "," + bmi2); } 継承がある場合のメソッド呼び出し(2/2) 子クラスにメソッドが定義されていない場合,親クラ スのメソッドが代わりに呼ばれる. public static void main(String[] args) { Student p1 = new Student(); Studentクラス p1.setGrade(1); p1.setHeight(1.7); Personクラス p1.setWeight(65); (Studentクラスに定義さ Student p2 = new Student(); れていないが,親クラス p2.setGrade(2); であるPersonクラスに定 p2.setHeight(1.6); 義されている.) p2.setWeight(55); double bmi1 = p1.getBMI(); double bmi2 = p2.getBMI(); int grade1 = p1.getGrade(); int grade2 = p2.getGrade(); System.out.println(grade1 + "," + bmi1); System.out.println(grade2 + "," + bmi2); メソッドのオーバーライド では,親クラスにも子クラスにも同じメソッドが定義さ れている場合は? このような場合をメソッドのオーバーライドといい子クラス 側のメソッドが呼び出される. public class Student extends Person { String id; // 学籍番号 int grade; // 学年 String getID() { return id; } : double getBMI() { return 0.0; } } オーバーライド (親クラス側で定義されて いるメソッドを子クラス側で も再定義している) 継承がある場合のメソッド呼び出しの まとめ 子クラス側からみて最初に見つかったメソッドが呼 び出される. 親クラス側 子クラス側 Person Student double height; double weight; double getHeight(); double getWeight(); double getBMI(); int grade; double getBMI(); int getGrade(); オブジェクト指向言語の基本概念 1. カプセル化 2. 3. データ構造とアルゴリズムの一体化 ⇒ クラス フィールドとメソッド クラスとインスタンス 継承 多相性(ポリモルフィズム) 多相性とは? 継承を用いることで,既存クラスを再利用(拡張)して 容易に新しいクラスを作成することができる. しかし,作成した新しいクラスはそのままでは利用され ることはない. 勝手に作成したクラスのメソッドを誰も呼び出してくれない. 例) 既存クラスAとBがあって,AがBを利用(呼び出し)しているとする. Bを拡張して新しいクラスB2を作成する. 既存クラスのAは新しくB2が作成されたことを知らない. B2を使ってもらうためには,既存クラスAも書き換える必要がある. ⇒新たにB2を作成したときに他のクラスをあまり書き換えたくない. 多相性:拡張に伴う書き換えを最小限にする仕組み.
© Copyright 2024 ExpyDoc