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