ソフトウェア工学 知能情報学部 新田直也
オブジェクト指向パラダイムと は オブジェクト指向言語の発展に伴って形成され てきたソフトウェア開発上の概念.オブジェク ト指向分析,オブジェクト指向設計など,プロ グラミング以外の工程でも用いられる. ソフトウェアを処理や関数ではなくオブジェク トに分解する. オブジェクト指向プログラミングの構成概念は 3 つ カプセル化(抽象データ型) 継承 多相性(ポリモルフィズム, polymorphism )
継承に関する注意 円クラスと楕円クラスはどちらが親か ? 楕円は円を一般化した概念なので,楕円クラスの方が 親 ? 円クラスの方がメンバが少ないので,円クラスの方が 親 ? 技術者の答え. 楕円と円を同じクラスにする. 楕円クラスと円クラスを兄弟にする. 過剰な継承はむしろ弊害が多い. 答えは 1 つではない. 実際にプログラミングしてみないとわからない. Shape CircleEllipse 継承
設計は何のためにするのか 設計の主目的: 実装者,保守者が楽をするため. 作業の無駄をなくすため.(作業が混乱しないよう に) もっとも楽でない作業は ? 他人のプログラムを読んで理解すること. 同じようなプログラムを何度も書くこと. よって,いい設計とは ? 各人が読むべき箇所の少ない設計. 同じ処理が一箇所にまとめられている設計.
多相性の考え方( 1 ) クラスを区別することなくメッセージを送りたい. 新しくクラスが付け加わっても,送り側を変更しない で済む. 送り側のプログラムの可読性が向上する. 移動せよ 図形移動 コマンド
多相性の考え方( 2 ) ただし,クラスによって定義されているメッセージが異 なる.そのクラスで定義されていないメッセージが送ら れてきたときどう対処すればよいのか? → 共通の親クラスを持つことを前提とすればよい. 移動せよ 図形移動 コマンド 「図形 クラ ス」
多相性の考え方( 3 ) クラス図を使った説明. 相手を親クラスのオブジェクトとみなしてメッセー ジを送る. 図形クラス 円クラス矩形クラス線分クラス 図形移動 コマンドクラス 移動せよ 継承
多相性の例 複数種の図形を同時に選択,編集する機能など. 矩形オブジェク ト 線分オブジェク ト 円オブジェクト
抽象クラスとインタフェース インタフェース( interface ): 定数と抽象メソッドだけを 持つことができる(クラスと並ぶ)記述単位.インスタンス 化できない.またクラスへの引継ぎは継承ではなく実装で行 われる.多相性はインタフェースを介しても実現できる. 抽象クラス(復習): 抽象メソッドを 1 つ以上持つクラス. インタフェース同様インスタンス化できない. 抽象クラスはひな型(未完成なクラス),インタフェースは 会話のための規格と考えればよい ? マウスリスナ インタフェース 円クラス矩形クラス線分クラス ウィンドウクラス マウスが押されたよ 実装 スライドクラス 実装
Java における多相性( 1 ) 子クラスのオブジェクトを親クラスまたはインタフェースの 変数で参照できる.(型キャストのようなもの) Shape s = new Circle(); s.move(100,50); s = new Rectangle(); s.move(100,50); s = new Line(); s.move(100,50); Circle クラスの インスタンスの生成 Circle クラスの move メソッド呼び出し Rectangle クラスの インスタンスの生成 Rectangle クラスの move メソッド呼び出し Line クラスの インスタンスの生成 Line クラスの move メソッド呼び出し
Java における多相性( 2 ) もう少し現実的なプログラム Shape s[] = new Shape[3]; s[0] = new Circle(); s[1] = new Rectanlge(); s[2] = new Line(); : for (i = 0; i < 3; i++) { s[i].move(x,y); } Shape クラスの配列 s[i] の実際のクラスに 非依存なコード 実際は様々な子クラス のオブジェクトが積まれる
Java におけるインタフェース Java ではクラスを定義するときに継承できるクラスは 1 つだけだが,インタフェースは複数実装することができ る. インタフェースは, interface キーワードを使って定義 する. 実装には, implements キーワードを用いる. インタフェース A 子クラス 実装 親クラスインタフェース B 継承
インタフェースの記述例 マウスリスナインタフェース Java の組み込みパッケージ AWT に含まれている. マウスのイベントを監視するインタフェース. public interface MouseListener extends EventListener { public void mouseClicked(MouseEvent e); public void mousePressed(MouseEvent e); public void mouseReleased(MouseEvent e); public void mouseEntered(MouseEvent e); public void mouseExited(MouseEvent e); } public class Circle extends Shape implements MouseListener {
本日のまとめ 多相性について. 多相性はカプセル化および継承の概念から自然 に導かれるもの. 多相性こそがオブジェクト指向設計の醍醐味. デザインパターン(後述)は,多相性を基盤に 構築されている.