サブゼミ第7回 実装編① オブジェクト型とキャスト.

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日 時田 陽一
アルゴリズムとデータ構造 第2回 線形リスト(復習).
オブジェクト指向プログラミング(4) 静的分析(2)
Applet 岡部 祐典 鈴木 敬幸.
アルゴリズムとデータ構造 2013年6月18日
~手続き指向からオブジェクト指向へ(Ⅰ)~
アルゴリズムとデータ構造 2010年7月5日
プログラミング基礎I(再) 山元進.
第5回 iPhoneアプリ開発勉強会 Objective-C 「継承とクラス」
アルゴリズムとプログラミング (Algorithms and Programming)
アルゴリズムとデータ構造 2012年6月14日
独習Java ・ 10.6  Hashtableクラス ・ 10.7  String Tokenizerクラス  12月12日    小笠原 一恵.
オブジェクト指向プログラミング(2) OOPの三大要素 「クラス」「ポリモーフィズム」「継承」
3-3 クラス図の関係その2.
アルゴリズムとデータ構造 2011年6月13日
アルゴリズムとプログラミング (Algorithms and Programming)
社会人学習講座 「Javaプログラミング概論」
インタフェース プログラミング 第14回 インタフェース プログラミング第14回.
アルゴリズムとデータ構造 2011年6月14日
アルゴリズムとデータ構造 2011年6月20日
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
RMI ソフトウェア特論 第6回 /
第6回独習Javaゼミ 第6章 セクション4~6 発表者 直江 宗紀.
プログラミング演習3 第2回 GUIの復習.
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
~手続き指向からオブジェクト指向へ[Ⅱ]~
第11回 アプリケーションの構成 ~CUI自動販売機の完成!~.
ソフトウェア工学 知能情報学部 新田直也.
サブゼミ第9回 実装編③ 永続化とjava.ioパッケージ.
JAVA入門後期⑩ 情報処理試験例題解説.
アルゴリズムとプログラミング (Algorithms and Programming)
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
アルゴリズムとデータ構造1 2006年7月4日
プログラミング 4 記憶の割り付け.
第11週:super/subクラス、継承性、メソッド再定義
11 ソフトウェア工学 Software Engineering デザインパターン DESIGN PATTERNS.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
アルゴリズムとデータ構造1 2005年7月5日
もっと詳しくArrayクラスについて調べるには → キーワード検索
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト・プログラミング 第8回.
実装編②HashTable,JavaAPI
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング 3 2 次元配列.
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
ソフトウェア工学 知能情報学部 新田直也.
C#プログラミング実習 第3回.
アルゴリズムとデータ構造 2012年6月11日
Javaによる Webアプリケーション入門 第4回
アルゴリズムとデータ構造1 2006年6月23日
アルゴリズムとデータ構造1 2009年7月2日
Chapter 5 5.5 thisキーワード 5.6 インスタンス変数とインスタンスメソッド 結城 隆
ゲームのタスクシステム 導入編 レベル2くまー By keychan.
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2012年6月21日
ソフトウェア工学 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
オブジェクト・プログラミング 第10回 オブジェクト指向設計のキモ.
プログラミング 3 ポインタ(1).
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
計算機プログラミングI 第10回 2002年12月19日(木) メソッドの再定義と動的結合 クイズ メソッドの再定義 (オーバーライド)
Presentation transcript:

サブゼミ第7回 実装編① オブジェクト型とキャスト

今週のGOAL GOAL ・Object型について理解し、Object型と キャストを用いた効率のよいプログラムが 書ける Objective Object型について説明できる 継承について軽く説明できる キャストができるようになる プログラミング勘を取り戻す

自販機の一部について扱う ・オブジェクト図 自動販売機システム <<オブジェクト図>> : 取扱貨幣型 貨幣B : 貨幣情報型 貨幣C : 貨幣情報型 貨幣A : 貨幣情報型 : 取扱商品型 商品A : 商品情報型 商品C : 商品情報型 商品B : 商品情報型

概念を用いてサービスを実現する ・クラス図(商品追加、貨幣追加を実装) VendingMachine Appli

モデルの問題点を探す 問題のあるモデル 構造がわかりにくく無駄が多いモデル コードが何箇所かで重複している

現在のモデルの問題 取扱商品と取扱貨幣に似たコードがある 配列を管理する機能についてのコードが重複している! public void 商品追加(商品情報型 追加商品情報){ 商品情報リスト[商品要素数]=追加商品情報; 商品要素数++; } public void 貨幣追加(貨幣情報型 追加貨幣情報){ 貨幣情報リスト[貨幣要素数]=追加貨幣情報; 貨幣要素数++;  } 配列を管理する機能についてのコードが重複している!

配列を管理するクラス ・クラス図改(配列を管理するクラスを追加) 取扱商品は配列リスト型を 使って商品情報型を持つ 自動販売機 <<クラス図>> 商品情報型 商品名 : String 取扱商品型 商品情報ID : int 価格 : int 商品追加() 商品表示() 1 1 0..n 0..n get価格() 配列リスト型 要素数 : int 追加() 取得() get要素数() get商品情報ID() get商品名() VendingMachine Appli 貨幣情報型 取扱貨幣型 貨幣情報ID : int 価値 : int 貨幣追加() 貨幣表示() 1 1 0..n 0..n get価値() get貨幣情報ID()

配列リストクラスの役割 ・配列を管理するとはどういうことか? 今までは取扱商品と取扱貨幣が個別に 商品情報と貨幣情報の配列を用意して使っていた 配列リストクラスが配列を用意し 取扱商品と取扱貨幣は用意された配列を用途に 応じて商品情報や貨幣情報の配列として使う

クラスの抽象化 場合によって商品情報の配列としても 貨幣情報の配列としても扱うことが できるようにするにはどうすればいいか? 貨幣情報と商品情報クラスの インスタンスを抽象化してObject型の インスタンスとして扱う

Object型とは すべてのクラスはObject型を継承している Object型はすべてのクラスを抽象化したもの Javaでは貨幣情報型や商品情報型を含めた すべてのクラスはObject型の特別な形である すべてのクラスのインスタンスはObject型の インスタンスとして扱うこともできる すべてのクラスはObject型を継承している Object型はすべてのクラスを抽象化したもの

} 抽象化=わかりやすい! みんな呼吸をすることを 説明したい 哺乳類は呼吸をする 抽象化してわかりやすくしている! 抽象化ってすごくわかりにくい気がしませんか? 石原君 青山君 ニホンザルの次郎君 } みんな呼吸をすることを 説明したい 哺乳類は呼吸をする 抽象化してわかりやすくしている!

継承をクラス図では スーパークラス サブクラス ・・・・・ 自分で継承をつかうこともできるが 特別な形である!ということを忘れてはならない 結果的に非常にわかりにくいコードの原因となる むやみに使ってはいけない equals()やtoStringなどの 操作をクラスの中で 宣言しなくても使えるのは Object型を継承しているから ・・・・・

継承の例 図には表れないが 呼吸をする()、寝る()などの 操作を持っている

継承をするとどうなる? しかしむやみに継承を使うことは コードがわかりにくくなる原因になります あくまでも「AはBの特別な場合である」 抽象化により異なったクラスのオブジェクトを  まとめて扱うことができる スーパークラスのメソッドや変数を  サブクラスでも使うことができる 重複コードが減る しかしむやみに継承を使うことは コードがわかりにくくなる原因になります あくまでも「AはBの特別な場合である」 というときにしか使わない サブクラス  スーパークラス

配列リストの実装方法 追加()メソッドはObject型か Object型のサブクラスの インスタンスを受け取ることができる private Object[] リスト;//Object型のインスタンスを配列で持つ                     :                     : public void 追加(Object 追加オブジェクト){ リスト[要素数]=追加オブジェクト; 要素数++; } 追加()メソッドはObject型か Object型のサブクラスの インスタンスを受け取ることができる

配列から取り出すとき 配列リスト型の取得()メソッドを使う /** * リストから指定された位置にある配列のオブジェクトを返すメソッド */ public Object 取得(int 取得位置){ return リスト[取得位置]; }

オブジェクトを取り出して使う これをコンパイルするとどうなると思いますか? System.out.println((貨幣情報リスト.取得(i)).get貨幣情報ID()); 貨幣情報型 返り血 = 貨幣情報リスト.取得(2); これをコンパイルするとどうなると思いますか? 取得()メソッドはObject型のインスタンスを 返すので貨幣情報型のメソッドである get貨幣情報ID()を呼び出すことができない

キャストをしよう キャスト オブジェクト型のインスタンスを取り出す System.out.println(((貨幣情報型)(貨幣情報リスト.取得(i))).get貨幣情報ID()); キャスト オブジェクト型のインスタンスを取り出す 取り出したオブジェクト型のインスタンスを貨幣情報型にキャストして 貨幣情報型のインスタンスとして扱う

継承とキャスト スーパークラスのインスタンスとして 扱っていた サブクラスのインスタンスを元通り サブクラスのインスタンスとして扱う キャストは一度抽象化したインスタンスを 具象化して使うこと

キャストの注意 あるクラスのインスタンスを 別の間違ったクラスのインスタンスに キャストしようとすると・・・・・ 実行時にClassCastExceptionがでます。 コンパイルエラーはでないので注意しましょう

まとめ クラスをさらに抽象化してあつかうことで 効率のよいプログラムを書くことができる クラスをさらに抽象化してあつかうことで  効率のよいプログラムを書くことができる 抽象化したインスタンスをもう一度  具体化して扱うためにはキャストが必要

今週の課題 配布したプログラムに次の変更を加えてください 1,商品を追加()メソッドを改良して  追加しようとした商品の商品情報IDが  追加済みの商品情報のIDと同じだったときに  商品の追加をせずにエラーメッセージを表示するように  変更してください 2,取扱商品と取扱貨幣に最後に追加した商品/貨幣情報を  削除するメソッドを追加してください