ソフトウェア工学 知能情報学部 新田直也
汎化と特化(1) 互いに「似ている」クラスがある. 円クラス,矩形クラス,線分クラス フレームクラス,ダイアログクラス
汎化と特化(2) 似ているクラスの共通部分を新たなクラスとして定義できる.(汎化) 円クラス,矩形クラス,線分クラス フレームクラス,ダイアログクラス 「図形クラス」 「ウィンドウ クラス」
汎化と特化(3) 共通部分を使って個別のクラスを定義することを特化という.(汎化の逆) 特化してできたクラスを子クラス,元のクラスを親クラスと呼ぶ.また,子クラスが親クラスの性質を受け継ぐことを継承と呼ぶ. 図形クラス 親クラス 汎化 特化 矩形クラス 子クラス(派生クラス)
汎化と特化(4) 親クラスの性質を継承できるので,子クラス側にはそのクラス固有の部分だけを定義すればよい.(差分プログラミング,実装の継承) 図形クラス 共通部分 図形クラス 図形クラス 図形クラス 円クラス 矩形クラス 線分クラス
Javaにおける継承 クラス定義でextendsキーワードを使う. (Shapeクラスを継承してCircleクラスを定義する例) class Shape { int color; : } class Circle extends Shape { double radius; // 半径 double x; // x座標 double y; // y座標 void move(double px, double py) { Shape 親クラス名 Circle int color; は定義しなくてもよい.
メソッドのオーバーライド 子クラスで親クラスと同名のメソッドを定義したときは,メソッドの定義が上書きされる.(オーバーライド) class Circle extends Shape { double radius; : void resize(double scale) { radius = radius * scale; } class Ellipse extends Circle { double radius2; radius2 = radius2 * scale; Shape Circle Ellipse
抽象クラス,抽象メソッド インスタンス化できないクラスを抽象クラスという. プロトタイプだけで本体が定義されていないメソッドを抽象メソッドという. 抽象メソッドを1つでも持つクラスは抽象クラスとして定義しなければならない. 子クラスで抽象メソッドをオーバーライドしなければ使えない. abstract class Shape { int color; abstract void move(double px, double py); abstract void resize(double scale); }
説明を省略したJavaの機能 コンストラクタとnew演算子 アクセス修飾子 this演算子,super演算子 static修飾子 public, protected, private this演算子,super演算子 static修飾子 メソッドのオーバーロード
継承に関する注意 円クラスと楕円クラスはどちらが親か? 技術者の答え. 過剰な継承はむしろ弊害が多い. 答えは1つではない. 楕円は円を一般化した概念なので,楕円クラスの方が親? 円クラスの方がメンバが少ないので,円クラスの方が親? 技術者の答え. 楕円と円を同じクラスにする. 楕円クラスと円クラスを兄弟にする. 過剰な継承はむしろ弊害が多い. 答えは1つではない. 実際にプログラミングしてみないとわからない. Shape Circle Ellipse
本日のまとめ オブジェクト指向(クラス指向)の基本概念: 汎化,特化の関係は対象領域上に存在する. カプセル化 継承 多相性 汎化,特化の関係は対象領域上に存在する. 継承は楽をするため(再利用して実装作業の重複を減らすため)にある. ただし,真に重要なのは実装の継承ではなくてインタフェースの継承(次回の多相性で用いる). 継承(というか設計全般)の妥当性は実際にプログラミング(実装)してみるまでわからない.