ソフトウェア工学 知能情報学部 新田直也 オブジェクト指向パラダイムとは オブジェクト指向言語の発展に伴って形成されてき たソフトウェア開発上の概念.オブジェクト指向分析, オブジェクト指向設計など,プログラミング以外の工 程でも用いられる. ソフトウェアを処理や関数ではなくオブジェクトに分 解する. オブジェクト指向プログラミングの構成概念は3つ カプセル化(抽象データ型) 継承 多相性(ポリモルフィズム,polymorphism) 継承に関する注意 円クラスと楕円クラスはどちらが親か? 楕円は円を一般化した概念なので,楕円クラスの方が親? 円クラスの方がメンバが少ないので,円クラスの方が親? 技術者の答え. 楕円と円を同じクラスにする. 楕円クラスと円クラスを兄弟にする. Shape 継承 Circle 過剰な継承はむしろ弊害が多い. 答えは1つではない. 実際にプログラミングしてみないとわからない. 継承 Ellipse 設計は何のためにするのか 設計の主目的: もっとも楽でない作業は? 実装者,保守者が楽をするため. 作業の無駄をなくすため.(作業が混乱しないように) 他人のプログラムを読んで理解すること. 同じようなプログラムを何度も書くこと. よって,いい設計とは? 各人が読むべき箇所の少ない設計. 同じ処理が一箇所にまとめられている設計. 多相性の考え方(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); Lineクラスの moveメソッド呼び出し Circleクラスの インスタンスの生成 Circleクラスの moveメソッド呼び出し Rectangleクラスの インスタンスの生成 Rectangleクラスの moveメソッド呼び出し Lineクラスの インスタンスの生成 Javaにおける多相性(2) もう少し現実的なプログラム Shapeクラスの配列 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); s[i]の実際のクラスに 非依存なコード } Javaにおけるインタフェース Javaではクラスを定義するときに継承できるクラスは1つだ けだが,インタフェースは複数実装することができる. 親クラス 継承 インタフェースA インタフェースB 実装 実装 子クラス インタフェースは,interface キーワードを使って定義する. 実装には,implements キーワードを用いる. インタフェースの記述例 マウスリスナインタフェース 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 { 本日のまとめ 多相性について. 多相性はカプセル化および継承の概念から自然に 導かれるもの. 多相性こそがオブジェクト指向設計の醍醐味. デザインパターン(後述)は,多相性を基盤に構築さ れている.
© Copyright 2025 ExpyDoc