オブジェクト指向プログラミング13

オブジェクト指向
プログラミング
第十三回
知能情報学部
新田直也
オブジェクト指向言語の基本概念
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);
}
}
多相性のまとめ
継承による拡張性,再利用性の向上をさらに推し進
めるもの.
 拡張した時のプログラムの書き換えを最小限にする
ことができる.




後に行う拡張が過去に書いたプログラムに影響を与えな
いようにする.
過去に書いたプログラムが未来のプログラムを呼び出す
ことができる.
多相性をうまく使いこなすには経験と勘が必要.

オブジェクト指向設計法.