Presentation is loading. Please wait.

Presentation is loading. Please wait.

オブジェクト指向言語論 第十回 知能情報学部 新田直也.

Similar presentations


Presentation on theme: "オブジェクト指向言語論 第十回 知能情報学部 新田直也."— Presentation transcript:

1 オブジェクト指向言語論 第十回 知能情報学部 新田直也

2 継承 継承: 基本となるクラスを拡張して,新しいクラスを定義すること. 親クラス: 元となるクラス.スーパークラスとも言う.
親クラス: 元となるクラス.スーパークラスとも言う. 子クラス: 親クラスを拡張したクラス.拡張した部分だけ定義する. クラスA 基底クラス クラスC 派生 クラスB 派生 クラスD 派生

3 Javaによるオブジェクト指向 (継承) extends キーワードを使って継承する. 拡張するインスタンス変数,メソッドのみ定義する.
例: class Vector3D extends Vector { double z; Vector add(Vector a) { x += a.x; y += a.y; z += a.z; return this; } double inner_product(Vector a) { return x * a.x + y * a.y + z * a.z; } Vector3D outer_product(Vector3D a) { return new Vector3D(y*a.z - z*a.y, z*a.x - x*a.z, x*a.y - y*a.x); } } 拡張するメンバ変数 置き換える メソッド 拡張する メソッド

4 Javaによるオブジェクト指向 (オーバーライド)
オーバーライド: 継承によるメソッドの置き換え. Vector3Dでは,addと inner_productをオーバーライドしている. Vector double x; double y; Vector add(Vector a); double inner_product(Vector a); double length(); Vector3D double z; Vector add(Vector a); double inner_product(Vector a); Vector3D outer_product(Vector3D a);

5 Javaによるオブジェクト指向 (継承とメソッド呼出し)
メソッド呼出しの例: →変数の型宣言だけを見て呼出し先がわかることに注意!! class Test { public static void main(String args[]) { Vector a = new Vector(5, 10); Vector b = new Vector(15, 20); Vector3D c = new Vector3D(5, 10, 15); Vector3D d = new Vector3D(20, 25, 30); System.out.println(a.inner_product(b)); System.out.println(c.inner_product(d)); System.out.println(a.length()); System.out.println(c.length()); a = a.outer_product(b); c = c.outer_product(d); } } Vectorの Vector3Dの Vectorの Vectorの エラー!! Vector3Dの

6 Javaによるオブジェクト指向 (多態性1)
ところで… class Vector { : double length() { return Math.sqrt(this.inner_product(this)); } } class Test { public static void main(String args[]) { Vector a = new Vector(5, 10); : Vector3D c = new Vector3D(5, 10, 15); : System.out.println(a.length()); System.out.println(c.length()); : どちらの inner_product が呼ばれるか? Vector の length() Vector の length()

7 Javaによるオブジェクト指向 (多態性2)
多態性(ポリモルフィズム): class Vector { : double length() { return Math.sqrt(this.inner_product(this)); } } class Test { public static void main(String args[]) { Vector a = new Vector(5, 10); : Vector3D c = new Vector3D(5, 10, 15); : System.out.println(a.length()); System.out.println(c.length()); : this の「実際の」型に応じて 呼び分けられる this = c this = a

8 Javaによるオブジェクト指向 (多態性3)
ポリモルフィズムの別の例: class Test { public static void main(String args[]) { Vector a = new Vector(5, 10); Vector b = new Vector(15, 20); System.out.println(a.inner_product(b)); Vector c = new Vector3D(5, 10, 15); Vector d = new Vector3D(20, 25, 30); System.out.println(c.inner_product(d)); a = c; b = d; System.out.println(a.inner_product(b)); } } cはVectorで宣言されているが, 「実際の」型はVector3D aはVectorで宣言されているが, 「実際の」型はVector3D

9 多態性の考え方 メッセージを送る人は送り先の具体的なクラス (具象クラス)を知らなくてもよい.
実際に呼ぶメソッドは実行時に決まる(遅延束縛). Vector Vector a Test Vector a inner_product() Vector a Vector3D inner_product() Vector4D

10 多態性の使い方1 異なる種類のオブジェクトに一括して処理を行う場合 →図形はすべて移動することができる. →移動の処理は図形ごとに異なる. →実行時までどのクラスのオブジェクトが選択されるか不明. クラス 移動 選択 図形 三角 五角 四角

11 多態性の使い方2 クラス定義: class Shape { // 図形クラス
void move(int x, int y) { // 移動メソッド : } class Trianle extends Shape { // 三角形クラス void move(int x, int y) { // 移動メソッドをオーバーライド class Rectangle extends Shape { // 四角形クラス

12 多態性の使い方3 選択図形の移動: // 選択図形の配列を取得(図形の具象クラスは不明)
Shape [] sel_obj = GetSelectedObjects(); // 配列中の各要素を移動する for (int n = 0; n < sel_obj.length; n++) { sel_obj[n].move(x, y); } Shape クラス の参照変数の 配列 多態性により Shape クラスまたは子クラス のmoveメソッドが呼 ばれる Shape sel_obj[n]


Download ppt "オブジェクト指向言語論 第十回 知能情報学部 新田直也."

Similar presentations


Ads by Google