JavaとUMLで学ぶ オブジェクト指向の考え方 第7章 2003/7/3 時松 誠治 今日の内容 再利用化 継承 ポリモーフィズム コンポジション 継承、コンポジションの利点と欠点 継承 VS コンポジション まとめ 継承とコンポジション 継承とは is-a関係 クラスの属性と振る舞い を継承 例:A dog is-a mammal ホワイトボックス再利用 コンポジションとは has-a関係 他のクラスから複合的 なクラスを構築 例:Car has-an engine ブラックボックス再利用 どちらも再利用性を考慮した設計拡張の手段 継承の例(1) 汎化 鳥 飛距離:int 飛ぶ:void カラス ダチョウは飛べない! キツツキ ダチョウ 特化 突つく:void 穴ほぎ:void 走る:void 継承を使う場合は共通点を洗い出すこと重要 継承の例(2) 鳥 関係が複雑に 飛距離:int 飛ぶ:void 飛ぶ鳥 飛ばない鳥 飛距離:int 飛ぶ:void カラス 突つく:void キツツキ 穴ほぎ:void そもそも飛べる鳥と 飛べない鳥を分ける 必要があるのか? ダチョウ 走る:void 単純にするか複雑に するかはシステムへの 要求によって決まる ポリモーフィズム(多態性) ポリモーフィズムとは 同じアクセスに対して、オブジェクトごとに異な る動作をすること ポリモーフィズムの例 斜体は 抽象○○ RectangleとCircleは 同じ図形 Shape 図形には面積が あるが、その求め方は さまざま #area:double +getArea:double Rectangle Circle length:double width:double radius:double +getArea:double +getArea:double それぞれでgetAreaを 定義する (オーバーライド) オブジェクトは 自分自身について 責任をもつ コンポジション コンポジションについて オブジェクトの集合体(もしくはその構築方法) 集約とコンポジションを区別する場合もある 集約 < コンポジション 自動車 チューブ エンジン タイヤ ホイール 継承の利点 継承の利点は・・・ コードの再利用性が向上 → 一度書いたコードを何度も書き直す必要がない 属性、振る舞いの一極集中 → コードの管理が容易に テスト時間の短縮 → 親クラスをテストする必要がない システムの静的解析が容易 → 保守、拡張が行いやすい 継承の欠点 継承の利点が欠点にも・・・ コードの再利用性が向上 → クラス階層内のカプセル化が弱められる 属性、振る舞いの一極集中 → わずかな変更が多大な影響を及ぼす テスト時間の短縮 → 親クラスの変更により子クラスもテストしな ければならない (継承と比べた) コンポジションの利点と欠点 ○ カプセル化に優れる ○ オブジェクト単体の完結性の向上 × システムの構造がわかりにくく × 実行時の動作速度の低下 継承の代用 Rectangle 委譲(特別な コンポジション) を用いる Window Windowは四角だから Rectangleクラスの サブクラスだ! Rectangle Window 四角形に関する部分は Rectangleクラスに 委譲しよう! ポリモーフィズムの代用 インターフェースを用いる <<interface>> Shape Shape Shape Shape #area:double #area:double +getArea:double +getArea:double +getArea:double +getArea:double Rectangle Circle Rectangle Circle length:double width:double radius:double length:double width:double radius:double +getArea:double +getArea:double +getArea:double +getArea:double 継承 VS コンポジション 継承 カプセル化が弱いが、わかりやすい コンポジション カプセル化が強いが、わかりにくい どちらも一長一短。 既存のクラスを用いてコンポジションし、 足りない部分は継承を用いて構築 まとめ 再利用化のメカニズム 継承 コンポジション 継承の利点と欠点 コンポジションの利点と欠点 継承とコンポジションの融合
© Copyright 2024 ExpyDoc