プログラミング演習3 - 法政大学 情報科学部

プログラミング演習3
継承(Inheritance)の復習と演習
目次
• 継承
– 継承とは
– 実装例
• インターフェイス
– 多重継承とは
– 実装例
• 演習
• Exercise1
継承(Inheritance)とは
いくつかのオブジェクトは共通した性質や特徴を持っ
ている。その共通部分をスーパークラスとして定義し、
そのクラスを継承したサブクラスの中でそれぞれ異な
る部分を定義する。 スーパークラス
?
サブクラス
継承
サブクラス
継承の例
スーパークラス
自動車
速度
乗車人数
アクセル / ブレーキ
サブクラス
パトカー
バス
速度
赤色警光灯
乗車人数 = 5
アクセル / ブレーキ
速度
2 つの自動扉
乗車人数 = 15
アクセル / ブレーキ
乗用車
速度
乗車人数 = 5
アクセル / ブレーキ
継承の例
スーパークラス
自動車
速度
乗車人数
アクセル / ブレーキ
サブクラス
パトカー extends 自動車
バス extends 自動車
速度
赤色警光灯
乗車人数 = 5
アクセル / ブレーキ
速度
2 つの自動扉
乗車人数 = 15
アクセル / ブレーキ
乗用車 extends 自動車
速度
乗車人数 = 5
アクセル / ブレーキ
継承の実装 - JAVA スーパークラス
サブクラス
多重継承とインターフェイス
多重継承とは2つ以上のクラスを継承することを指し、
JAVAではインターフェイスの実装によって実現する。
インターフェイス
クラス : 充電出来るもの
クラス : 自動車
インターフェイス
クラス : 給油出来るもの
?
?
実装
継承
継承
クラス : 電気自動車
?
継承
実装
継承
クラス : ガソリン自動車
給油
インターフェイスの例
基本的には
メソッドのみ
インターフェイス
給油出来るもの
ガソリンスタンド
給油(給油出来るもの)
・・・
給油(量)
実装クラス
自動車
給油(量)
ガソリン量
4輪
自動二輪車
給油(量)
ガソリン量
2輪
オーバーライド
ストーブ
給油(量)
灯油量
発熱する
インターフェイスの実装
インターフェイス
実装クラス
public class Tire {
}
演習 : インターフェイスを使ってみよう
「10人の客(乗用車、バイク、ストーブのいずれかラン
ダムに決定)に1~100(L)の給油をするガソリンスタンド
をシミュレートする実行クラス : RefuelSimulation」を作
成する。給油の際には、どの種類の客が何リットル給
油したか出力すること。
実行結果例
演習 : インターフェイスを使ってみよう
ヒント
メンバーのインスタンス化
給油を行なう
演習 : 図形クラスを定義してみよう
それぞれの図形のサイズが一定であるとき、共通する
メンバやメソッドをスーパークラスに書き出す。ただし、
いずれのクラスも「面積を返すメソッド : area(引数)」 を
持つこと。
BigSquare
BigRectangle
BigIsoscelesTriangle
BigCircle
40 * 40 (pixel)
60 * 20 (pixel)
40 * 25 (pixel)
40 * 40 (pixel)
SmallIsoscelesTriangle
SmallCircle
25 * 15 (pixel)
15 * 15 (pixel)
SmallSquare SmallRectangle
10 * 10 (pixel)
30 * 10 (pixel)
演習 : 図形クラスを定義してみよう
?
Polygon
Rectangle
Square
Shape
?
?
? IsoscelesTriangle
?
?
Circle
SmallRectangle
BigRectangle
SmallSquare
BigSquare
SmallCircle
SmallIsoscelesTriangle
BigCircle
BigIsoscelesTriangle
演習 : Drawableインターフェイスを
定義してみよう
インターフェイス Drawable を定義し、それぞれの図形
クラスに以下のメソッドを持たせる。
「座標(x, y)を中心に形を描画するメソッド : draw(int x, int y)」
「座標(x, y)を中心に形を描画し、塗りつぶすメソッド : drawfill(int x, int y)」
「図形の色を設定するメソッド : setColor(Color c)」
「図形の色を返すメソッド : getColor()」
ただし、「draw(int x, int y)」を実行すると“〇〇(クラス名)を(x, y)に描画”、
「drawfill(int x, int y)」を実行すると“〇〇(クラス名)を(x, y)に塗りつぶして描
画”という文字列がコンソールに出力されること。
draw(int x, int y)
drawfill(int x, int y)
setColor(Color c)
getColor()
追加
Exercise1
1. 複数の図形をメンバとして持ち、それらを順に描画することで
複雑な図形が全体の描画を実現するために、「インターフェイ
ス : CompoundDrawable」を定義する。CompoundDrawble は
Drawableの持つメソッドに加え、「メンバである全ての図形オブ
ジェクトを返すメソッド : getParts()」を持つ。
2. CompoundDrawableを利用して、図1のような図形を描画する
Treeクラスを定義する。(描画処理は実装しないため、座標や
サイズが正確である必要はない。)
BigIsoscelesTriangle
図1. 木
SmallSquare
SmallIsoscelesTriangle
BigIsoscelesTriangle
Exercise1
3. 「描画の実行クラス : DrawTest」を作成し、Treeクラスの描画を
テストする。ただし、「draw(int x, int y)」を実行すると“〇〇(クラス名)を(x,
y)に描画” という文字列がコンソールに出力されること。
実行結果例