pi-11. Javaにおけるオブジェク
ト指向設計:クラス階層,多相
性,インターフェース,デザイ
ンパターン
1
金子邦彦
(Java マスター講座:基礎から応用まで)
URL: https://www.kkaneko.jp/pro/pi/index.html
Javaのオブジェクト指向設計における,クラス階層・
多相性・インターフェースの仕組みとデザインパターン
の基礎
【学習内容の構成】
• クラス階層と多相性:スーパークラスによる共通機能
の集約と,メソッドのオーバーライドによるサブクラ
スごとの振る舞いの実現
• インターフェース:継承関係がないクラス間で同名メ
ソッドの実装を保証し,同一種類のオブジェクトとし
て扱う仕組み
• デザインパターン:プログラムで頻出するパターン
(GoFの23パターン)の活用
• 前提:Javaの基本文法,クラスとオブジェクトの理解
• 意義:プログラムのミス削減,拡張性の向上,設計の
定石の習得
2
Java Tutor の起動
① ウェブブラウザを起動する
② Java Tutor を使いたいので,次の URL を開く
https://pythontutor.com/java.html
③ 「Java」をクリック ⇒ 編集画面が開く
3
Java Tutor でのプログラム実行手順
4
(1)「Visualize Execution」をク
リックして実行画面に切り替える
(2)「Last」をクリック.
(3) 実行結果を確認する.
(4)「Edit this code」をク
リックして編集画面に戻る
Java Tutor 使用上の注意点①
• 実行画面で,次のような赤の表示が出ることがある →
無視してよい
過去の文法ミスに関する確認表示
邪魔なときは「Close」
5
Java Tutor 使用上の注意点②
「please wait ... executing」のとき,10秒ほど待つ.
→ 混雑しているときは, 「Server Busy・・・」
というメッセージが出ることがある.
混雑している.少し(数秒から数十秒)待つと自
動で表示が変わる(変わらない場合には,操作を
もう一度行ってみる)
6
11-1. クラス階層と多相性
7
8
円(Circle)
半径 3,場所(2, 4)
色 green
幅 1, 高さ 2, 場所(6, 4)
色 black
長方形
(Rectangle)
クラス階層は何のため?
• 似通ったクラス Circle, Rectangle を使いたい.プロ
グラムのミスを減らすため,スーパークラスを考える
• 将来,図形の種類を増やすときにも有効
9
Figure
Circle
親
子
Rectangle
親
子
クラス Circle, クラス Rectangle が似ている.
共通する機能を、スーパークラス Figure にまとめる.
スーパークラス
サブクラス
10
円(Circle)
半径 3,場所(2, 4)
色 green
幅 1, 高さ 2, 場所(6, 4)
色 black
長方形
(Rectangle)
Circle クラスでもあり,
Figure クラスでもある
Rectangle クラスでもあり,
Figure クラスでもある
Java のメソッド
• 上下左右の移動
• オブジェクトの属性 x, y を増減
• そのためのメソッド move を Figure クラスに定義
11
x
y
右
x が増える
左
x が減る
上
y が増える
下
y が減る
Java のメソッド
• 面積を求める
• そのためのメソッド size を定義
円: 半径 × 半径 × 3.14
長方形: 縦 × 横
12
メソッドのオーバーライド
• 同じ名前のメソッドが,クラスによって違った意
味を持つ
メソッド area
クラス Figure では 0
クラス Circle では 円の面積
クラス Rectangle では 長方形の面積
13
演習
資料:16 ~ 18
【トピックス】
• クラス階層
• メソッドのオーバーライド
14
15
メソッド area
メソッド move
メソッド area
① Java Tutor のエディタで次のプログラムを入れる
16
続き
メソッドを呼び出す部分
メソッド area
② 実行し,結果を確認する
17
「Visual Execution」をクリック.そして「Last」をクリック.結果を確認.
「Edit this code」をクリックすると,エディタの画面に戻る
多相性
• さまざまなサブクラスのオブジェクトを、「スー
パークラスのオブジェクトである」と思って扱う
ときに役立つ
18
演習
資料:21 ~ 23
【トピックス】
• クラス階層
• メソッドのオーバーライド
• 多相性
19
20
① Java Tutor のエディタで次のプログラムを入れる
21
続き
② 実行し,結果を確認する
22
「Visual Execution」をクリック.そして「Last」をクリック.結果を確認.
「Edit this code」をクリックすると,エディタの画面に戻る
• リストに、要素を追加
• このリストは「ArrayList<Figure>」
• x や a は、Figure クラスのオブジェクトとして、
リストに追加される
• 多相性により、move メソッド(面積の算出)に
問題ない.x では円の面積、a では長方形の面積
23
11-2. インターフェイスと実装
24
さまざまなクラスのオブジェクトを、「同じ種類のオブ
ジェクトである」かのように扱う2つの方法
① スーパークラスとサブクラス、多相性 (11-1. で説明)
継承あり
② インターフェイス (11-2. で説明)
Java 処理系は、クラスがインターフェイスに準拠
するかチェックを行う
(「継承」は無関係)
25
2つのクラス
Matome Bara
属性 属性
number price
unit
メソッド
total total
26
名前は同じだが,
中身が違う
数 (number)と
単価 (unit)
価格 (price)
共通する属性がない
インターフェイス
複数のクラス A, B が
名前が同じメソッドを持つとき
A, B は,共通するインターフェイスを持つ
と考えることができる
(メソッドの中身は違っても構わない)
Java 処理系には,クラスがインターフェイスに準
拠するかをチェックする機能がある.
インターフェースは Java, C# 言語などが持つ機能
27
インターフェイスの Java プログラム例
28
インターフェイス名
中身のないメソッド
クラス定義で,インターフェイス準拠の指定
29
クラス Matome がインターフェイス Product に準拠するとき
クラス定義で,インターフェイス準拠の指定
30
クラス Bara がインターフェイス Product に準拠するとき
インターフェイスの機能①
メソッドの定義を忘れるなどで、
インターフェイスに適合しないときは、
警告メッセージが出る
31
演習
資料:34 ~ 36
【トピックス】
• インターフェイス
32
33
クラス定義
インターフェイス
① Java Tutor のエディタで次のプログラムを入れる
34
続き
クラス定義
② 実行し,結果を確認する
35
「Visual Execution」をクリック.そして「Last」をクリック.結果を確認.
「Edit this code」をクリックすると,エディタの画面に戻る
インターフェイスの機能②
コレクションとの組み合わせ
ArrayList<インターフェイス名>
のような使い方が可能
36
演習
資料:39 ~ 41
【トピックス】
• インターフェイス
• コレクション
37
38
① Java Tutor のエディタで次のプログラムを入れる
39
続き
② 実行し,結果を確認する
40
「Visual Execution」をクリック.そして「Last」をクリック.結果を確認.
「Edit this code」をクリックすると,エディタの画面に戻る
インターフェイス
• インターフェイスは,あるメソッドが実装済みで
あること保証する仕組み
• コレクションで「ArrayList<インターフェイス名
>」のように書くこともできる
• さまざまなクラスのオブジェクトを、「同じ種類
のオブジェクトである」かのように扱う仕組みの
1つ
41
11-3. デザインパターン
42
デザインパターンとは
• デザインパターンとは,プログラムで頻出される
とされるパターンのこと
• デザインパターンを知り,活用することが,プロ
グラムを簡単に確実に作成できる手段であると唱
える人も
• デザインパターンの種類は 23 である(GoFの23
パターン)という説も
43
デザインパターンの例
「Template Method」というデザインパターンの例.
サブクラスごとにメソッドの中身が違う.スーパーク
ラスでは、メソッドの中身は書かないというパターン
44
関連ページ
• Java プログラミング入門
GDB online を使用
https://www.kkaneko.jp/pro/ji/index.html
• Java の基本
Java Tutor, GDB online を使用
https://www.kkaneko.jp/pro/pi/index.html
• Java プログラム例
https://www.kkaneko.jp/pro/java/index.html
45