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

オブジェクト指向
プログラミング
第十ニ回
知能情報学部
新田直也
オブジェクト指向言語の基本概念
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を作成したときに他のクラスをあまり書き換えたくない.


多相性:拡張に伴う書き換えを最小限にする仕組み.