プログラム再構成に関する 特許申請について

ソフトウェア工学
知能情報学部
新田直也
汎化と特化(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
本日のまとめ

オブジェクト指向の基本概念:



カプセル化
継承
多相性
継承について.
 継承は楽をするため(作業の重複を減らすため)に
ある.
 継承(というか設計全般)の妥当性はプログラミング
(実装)してみるまでわからない.
