計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

独習JAVA Chapter 6 6.6 クラスの修飾子 6.7 変数の修飾子 結城 隆. 6.6 クラスの修飾 abstract インスタンス化できないクラス。1つまたは複数のサブクラスで 実装してはじめてインスタンス化できる。 final 継承されたくないことを明示する。これ以上機能拡張 / 変更でき.
6.4継承とメソッド 6.5継承とコンストラクタ 11月28日 時田 陽一
Applet 岡部 祐典 鈴木 敬幸.
~手続き指向からオブジェクト指向へ(Ⅰ)~
プログラミング基礎I(再) 山元進.
アルゴリズムとデータ構造1 2007年6月12日
アルゴリズムとプログラミング (Algorithms and Programming)
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
アルゴリズムとプログラミング (Algorithms and Programming)
計算機プログラミングI 第12回 2003年1月23日(木) インターフェース スレッド 最後に お知らせ クイズ 授業アンケート
プログラミングIII演習 第1回目.
社会人学習講座 「Javaプログラミング概論」
第2章 Eclipseと簡単なオブジェクト 指向プログラミング
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
Bridge Pattern
オブジェクト指向入門.
計算機プログラミングI 第8回 2002年12月5日(木) メソッドとクラス (教科書6章) クイズ インスタンスメソッド インスタンス変数
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
~手続き指向からオブジェクト指向へ[Ⅱ]~
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
プログラミング言語入門 手続き型言語としてのJava
JAVA入門後期⑩ 情報処理試験例題解説.
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
計算機プログラミングI 第10回 データ構造とクラスの設計 例題: 話題: 複素数 図形要素 Morphing 複雑な値を一つにまとめる
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
コンパイラの解析 (3) クラスとインスタンスの初期化.
第11週:super/subクラス、継承性、メソッド再定義
オブジェクト指向 プログラミング 第十四回 知能情報学部 新田直也.
計算機プログラミングI 第11回 再帰 再帰的なメソッド定義 帰納的定義 再帰的なデータ構造 計算機プログラミングI (増原) 2003年度.
C#言語ソースプログラムの原型 C言語 C#言語 Hello World! Hello Students! オマジナイ! 適当なクラス名
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
計算機プログラミングI 第5回 配列 文字列(Stringクラス) mainの引数 配列の利用例
オブジェクト・プログラミング 第8回.
計算機プログラミングI 第8回 素数を見つけるアルゴリズム 継承とインスタンスメソッド クラスの設計 オブジェクトに機能を加える
計算機プログラミングI 第12回 スレッド インターフェース 授業アンケート 計算機プログラミングI (増原) 2003年度.
オブジェクト プログラミング 第2回 プログラムの基本.
プログラムのコメント.
アルゴリズムとプログラミング (Algorithms and Programming)
オブジェクト指向 プログラミング 第九回 知能情報学部 新田直也.
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
C#プログラミング実習 第3回.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
計算機プログラミングI 第3回 プリミティブ値 クラスメソッド クラス変数 式と演算 変数の利用
アルゴリズムとプログラミング (Algorithms and Programming)
計算機プログラミングI 第4回 2002年10月31日(木) 問題解決とアルゴリズム クラスメソッドと手続きの抽象化 最大公約数
Chapter 5 5.5 thisキーワード 5.6 インスタンス変数とインスタンスメソッド 結城 隆
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド) オブジェクト指向の意義 型について 参照型のキャスト final, abstract などの修飾子 フィールドの隠蔽 クイズ

違い: fdメソッドを 点線を描きながら進むように 7.3 メソッドの再定義 (オーバーライド) 再定義とは: 親クラスで定義されているメソッドと 同じ名前のメソッドを子クラスに定義すること 目的: 同じ指示に対して違った動きをさせる 定義の方法: 単に定義するだけ 例: polygon(5,50) polygon(5,50) Tensen House 違い: fdメソッドを 点線を描きながら進むように 再定義している

点線で多角形を描く public class Tensen extends House{ int psize = 4; (略: コンストラクタ) public void fd(int s){ 長さsの点線を描く } public static void main(String[] args){ (略: TurtleFrameの生成) Tensen m = new Tensen(); (略) m.polygon(5, 50); main から実行が始まる Tensenオブジェクトが 作られる Tensenオブジェクトのploygonメソッドを呼び出す ploygonメソッドは n角形を描く。その際、Tensenオブジェクトの fdは点線を描くように 再定義されているので、 n角形は点線で描かれる。

点線で多角形を描く Tensen 親クラスから 継承したpolygonを 実行 public class Tensen extends House{ int psize = 4; (略: コンストラクタ) public void fd(int s){ 長さsの点線を描く } public static void main(…){ (略: TurtleFrameの生成) Tensen m = new Tensen(); (略) m.polygon(5, 50); public class House extends Turtle { public void polygon(int n, int s){ int a = 360/n; for(int j = 0; j < n; j++){ fd(s); rt(a); } 再定義された fdが実行 ここから スタート 自身のfdを 呼び出し fd オブジェクト を作る メソッド 呼び出し polygon Tensen

点線で多角形を描く Tensen 結果: 点線で5角形が描かれる public class Tensen extends House{ int psize = 4; (略: コンストラクタ) public void fd(int s){ 長さsの点線を描く } public static void main(…){ (略: TurtleFrameの生成) Tensen m = new Tensen(); (略) m.polygon(5, 50); public class House extends Turtle { public void polygon(int n, int s){ int a = 360/n; for(int j = 0; j < n; j++){ fd(s); rt(a); } 再定義された fdが実行 Tensen 結果: 点線で5角形が描かれる

点線で多角形を描くしくみ Tensen Turtleクラス fd(s): 実線を描きながら前進 rt(a): 右回転 … Tensenオブジェクトへのpolygonメソッドの呼び出しは、親クラスの継承された定義の実行になる polygonメソッド中でのfdメソッドの呼び出しは、Tensenオブジェクトへのメソッド呼び出しなので、再定義されたfdが実行される extends Houseクラス fd(s): 継承 (実線を描きながら前進) polygon(n,s): fdを使って多角形を描く extends Tensenクラス fd(s): 点線を描きながら前進 polygon(n,s): 継承 (fdを使って多角形を描く) … 所属 Tensen

練習 (準備)* Tensen.java をコンパイルして実行し、点線で五角形が描かれることを確認せよ。 7.2* T71.javaをそのままコンパイルして実行した場合と、T71.javaを変更してHouseオブジェクトのかわりにTensenオブジェクトを作るようにした場合を試す (実行は java T71 house のようにクラス名(T71)の後に空白をあけて適当な文字列を書く。) (教科書外) Morphing課題で作成したプログラムやフラクタル図形の「木」を描くプログラム中のTurtleオブジェクトをTensenオブジェクトに置き換えてみよ。

親クラスのメソッドを使う方法 メソッドを再定義すると、 親クラスのメソッド定義が使えなくなる 例: Tensenオブジェクトのfdメソッド メソッド中で super . メソッド名(引数, ...) のようにメソッドを呼び出すと、 親クラスのメソッドを実行できる 例: Tensenオブジェクトのfdメソッド中で super.fd(psize) とすると、Turtleクラスに定義された 本来のfdメソッドが実行される

? 点線を描くしくみ public class Tensen extends House{ public class House int psize = 4; (略: コンストラクタ) public void fd(int s){ 長さsの点線を描く } public static void main(…){ (略: TurtleFrameの生成) Tensen m = new Tensen(); (略) m.polygon(5, 50); public class House extends Turtle { public void polygon(int n, int s){ int a = 360/n; for(int j = 0; j < n; j++){ fd(s); rt(a); } ?

点線を描くしくみ super . メソッド名(引数式, …) 親クラスのメソッドを呼び出す public class Tensen extends House{ int psize = 4; (略: コンストラクタ) public void fd(int s){ 長さsの点線を描く } public static void main(…){ (略: TurtleFrameの生成) Tensen m = new Tensen(); (略) m.polygon(5, 50); public class House extends Turtle { public void polygon(int n, int s){ int a = 360/n; for(int j = 0; j < n; j++){ fd(s); rt(a); } public void fd(int s){ int k, len; for(k = 0, len = 0 ; len + psize <= s; k++, len+= psize){ if(k % 2 == 0) down(); else up(); super.fd(psize); } down(); super.fd(s - len); ペンを交互に上げ下ろししながら、psizeづつ前進する super . メソッド名(引数式, …) 親クラスのメソッドを呼び出す

点線を描くしくみ Tensen Turtleクラス fd(s): 実線を描きながら前進 rt(a): 右回転 … Tensenオブジェクトのfdメソッドを呼び出すと、再定義されたメソッドが実行される 再定義されたメソッド中のsuper.fd(psize)は親クラスのfdメソッドを実行する。結果、Turtleクラスのfdメソッドが実行され、実線が描かれる extends Houseクラス fd(s): 継承 (実線を描きながら前進) polygon(n,s): fdを使って多角形を描く extends Tensenクラス fd(s): ペンを上下させながら super.fd(psize)を呼び出し polygon(n,s): 継承 (fdを使って多角形を描く) … 所属 Tensen

まとめると・・・ Tensen Turtleクラス fd(s): 実線を描きながら前進 extends rt(a): 右回転 … Houseクラス fd(s): 継承 (実線を描きながら前進) polygon(n,s): fdを使って多角形を描く polygon extends fd Tensenクラス fd(s): ペンを上下させながら super.fd(psize)を呼び出し polygon(n,s): 継承 (fdを使って多角形を描く) … 所属 Tensen

練習 7.3 注16のヒント参照。 ペンが下りてなかったら、 親クラスのfdと同じ動作をすればよい 7.4 7.5

モデル化とオブジェクト指向 問題解決の方法 →問題(実世界)に現われるモノを、 プログラム中でもなるべくそのまま扱いたい 問題をモデル化する アルゴリズムを考える それに基いてプログラムを作る →問題(実世界)に現われるモノを、 プログラム中でもなるべくそのまま扱いたい 実世界のモノは階層的に分類すると扱いやすい ↑ ↑ オブジェクト クラスの拡張

再定義・継承と オブジェクト指向 複雑なプログラムを簡単に作る ← すでにあるプログラムを再利用 再利用しやすいプログラムとは? 複雑なプログラムを簡単に作る ← すでにあるプログラムを再利用 再利用しやすいプログラムとは? 共通部分 + 場面によって変わる部分 に分かれている 再定義したメソッド 速度を変える メニューの表示内容 Menuクラスを拡張した MyMenuクラス 親クラスから継承 画面への表示

7.1 型について 型の目的: 処理と値の不一致を防ぐ 処理と値の不一致の例: 123 / “hello” 123 . fd(456) (Turtle m = new Turtle(); のときに) 123 * m m . multiply(m) 「型」を考えると、コンパイルしたときに 問題があることが分かる 大きなプログラムでは重要!

7.1 型について 型とは: 変数・引数・返値などがとり得る値の集合 型を使った検査: プログラムを実行しなくても問題が分かる 例: int, double, Turtle, Complex, ... 型を使った検査: 式 → その式から得られる値の集合が型 処理(演算・メソッド呼出等)→関係する式の型を調べる 123 / “hello” → int / String 123 . fd(456) → int . fd(int) (Turtle m = new Turtle(); のときに) 123 * m → int * Turtle m . multiply(m) → Turtle.multiply(Turtle) プログラムを実行しなくても問題が分かる

子クラスのオブジェクトは 親クラスのオブジェクトの オブジェクトと型 いつも同じとは 限らない m.fd(10) という式は正しいか? m にしまわれるオブジェクトのクラスに、 いつもfdというメソッドが定義されていれば正しい Java言語では: 変数mに型をつける (型=クラス) Turtle m; そのクラスにfdメソッドが定義されていれば正しい mにはそのクラスのオブジェクトしか代入できない 子クラスのオブジェクトは 親クラスのオブジェクトの かわりとして使える と子クラス を許してもこれは守られる

7.2 参照型とキャスト 7.4 final, abstractなどの修飾子 7.5 フィールドの隠蔽 (略)

クイズ