第6回PPT

本日のトピック
アップキャスト
ポリモーフィズム
オブジェクト指向概論
ーポリモーフィズムー
継承を利用した方法
インタフェースを利用した方法
情報理工学部
情報コミュニケーション学科
小川 均
[email protected]
Department of Information & communication science
1
アップキャスト
Department of Information & communication science
アップキャスト
スーパークラスの参照型変数にサブクラスのイ
ンスタンスを代入する
例
Smile smile2 = new SmileCircle(100, 100, 150, 30)
Smileクラスにつぎのmakeメソッドを加えたら
smile2で使用できるフィールドとメソッド
Smileクラスで設定しているフィールドとメソッド
[教科書44ページのSmileクラス]
size, centerX, centerY, eye
ゲッターメソッド,セッターメソッド
makeSmile
SmileCircleのmakeメソッドが呼び出される
Department of Information & communication science
2
3
public void make(Graphics g){
}
参照型変数で使用できるフィールドとメソッドは,
「参照型変数の型」で決まる
実行する際には,代入されるインスタンスの設定に
より決定される
Department of Information & communication science
4
1
ポリモーフィズム
ポリモーフィズムの実現法(1)
同じ名前のメソッドに対して,それぞれ異なる振る舞
いを持たせて,活用するための仕組み
• 例:Faceクラスを継承したPacManとPacManWithEye
Smile smile1, smile2;
smile1 = new SmileSquare(100, 100, 150, 30);
smile1.make(g);
smile2 = new SmileCircle(100, 300, 150, 30);
smile2.make(g);
呼び出す側のソースを全く変更することな
く,プログラムの動作を切り替えられる.
Department of Information & communication science
5
Smileクラス(1)
public class
protected
protected
protected
protected
継承を利用した方法
1. スーパークラスを1つ作成し,サブクラスを複数定義
する.このとき,スーパークラスのメソッドMを各サブク
ラスでオーバーライドすることで,処理内容の異なる
メソッドを作成する.
2. 呼び出し側のクラスで,スーパークラスを代入する変
数Vを用意する.
(スーパークラスを参照型とする変数V)
3. 実行させるサブクラスのインスタンスを変数Vに代入
する.
4. サブクラスのメソッドMを実行する:V.M
6
Department of Information & communication science
Smileクラス(2)
public void makeSmile(Graphics g){
g.setColor(Color.black);
g.fillArc(centerX - size / 4 - eye / 2,
centerY - size / 6 - eye / 2, eye, eye,
g.setColor(Color.yellow);
g.fillArc(centerX - size / 4 - eye / 2 + 3,
centerY - size / 6 - eye / 2 + 3, eye g.setColor(Color.black);
g.fillArc(centerX + size / 4 - eye / 2,
centerY - size / 6 - eye / 2, eye, eye,
g.setColor(Color.yellow);
g.fillArc(centerX + size / 4 - eye / 2 + 3,
centerY - size / 6 - eye / 2 + 3, eye g.setColor(Color.black);
g.fillArc(centerX - eye / 2,
centerY + size / 6 - eye / 2, eye, eye,
g.setColor(Color.yellow);
g.fillArc(centerX - eye / 2 + 3,
centerY + size / 6 - eye / 2 + 3, eye }
Smile{
int size;
int centerX;
int centerY;
int eye;
//ゲッターメソッド
<省略>
//セッターメソッド
<省略>
public void make(Graphics g){
}
0, 180);
6, eye - 6, 0, 180);
0, 180);
6, eye - 6, 0, 180);
180, 180);
6, eye - 6, 180, 180);
}
Department of Information & communication science
7
Department of Information & communication science
8
2
SmileCircleクラス
SmileSquareクラス
import java.awt.*;
import java.awt.*;
public class SmileCircle extends Smile{
public class SmileSquare extends Smile{
public SmileSquare(int size_, int centerX_, int centerY_, int eye_){
super(size_, centerX_, centerY_, eye_);
}
public SmileCircle(int size_, int centerX_, int centerY_, int eye_){
super(size_, centerX_, centerY_, eye_);
}
public void make(Graphics g){
makeFace(g);
super.makeSmile(g);
}
public void make(Graphics g){
makeFace(g);
super.makeSmile(g);
}
public void makeFace(Graphics g){
g.setColor(Color.yellow);
g.fillRect(centerX - size / 2, centerY - size / 2, size, size);
}
public void makeFace(Graphics g){
g.setColor(Color.yellow);
g.fillOval(centerX - size / 2, centerY - size / 2, size, size);
}
}
}
Department of Information & communication science
9
Department of Information & communication science
10
インタフェース
実行例
継承を用いるときは,リスコフの置換原理を守る必要
がある.この原理を守っているかどうかは,プログラ
マが判断する必要がある.
オーバーライドされたスーパークラスのメソッドは使
用されない.コンパイラを通すだけに利用する.
Javaでは,複数の継承はできない.
ポリモーフィズムで使用するメソッドを限定したい.
インタフェース
使えるメソッドの一覧を示す
Department of Information & communication science
11
Department of Information & communication science
12
3
ポリモーフィズムの実現法(2)
インタフェースの書式
インタフェースを利用した方法
1. インタフェースで使用できる(定義しないといけない)
メソッドを宣言する.
2. インタフェースを満たすクラスを作成する.
「インタフェースをクラスに実装する」という.
3. そのクラスのインスタンスをインタフェースで宣言し
た変数Vに代入する.
4. サブクラスのメソッドMを実行する:V.M
• インタフェースの定義
13
Department of Information & communication science
自動的に final public static
修飾子が付けられる
interface インタフェース名{
データ型 変数名 = 値;
戻り値 メソッド名(引数1,引数2,…);
…
自動的に abstract public 修飾子が付けられる
}
インタフェース名は複数書ける
• インタフェースの実装
class クラス名 implements インタフェース名{
戻り値 メソッド名(引数1,引数2,…){
メソッドの中身
}
…
}
Department of Information & communication science
14
final
インタフェースの特徴
• 変数に対して,値の変更を許さない
インタフェースのオブジェクトは直接生成することはで
きない.
インタフェースはクラスに「実装」して使う.
インタフェースを実装したクラスは宣言されているメ
ソッドを実装しなければならない.
インタフェース内で定義した変数は、定数になり変更
することができない.
• インタフェースの例
static
• システム全体で一つの値を持つ
例 public class StaticEx{
StaticEx x = new
static int a;
}
出力結果: “2”
Department of Information & communication science
StaticEx();
x.a = 1;
StaticEx y = new
StaticEx();
y.a = 2;
System.out.println(x.a);
public interface DrawFace{
void make(Graphics g);
}
15
Department of Information & communication science
16
4
インタフェースの利用例
インタフェースの利点
import java.awt.*;
複数実装できる.⇔ 継承は1つだけ
再利用性の向上や追加・変更への強さをより達成でき
る
インタフェースの実装
= そのクラス内で使用できるメソッドは限定されるが
実装されているのが保証される
public class SmileCircle extends Smile implements DrawFace{
public SmileCircle(int size_, int centerX_, int centerY_, int eye_){
super(size_, centerX_, centerY_, eye_);
}
public void make(Graphics g){
makeFace(g);
super.makeSmile(g);
}
例 DrawFace smile3 = new SmileCircle(100, 100, 150, 30);
smile3では,makeメソッドのみが利用可能
public void makeFace(Graphics g){
g.setColor(Color.yellow);
g.fillOval(centerX - size / 2, centerY - size / 2, size, size);
}
}
Department of Information & communication science
実装の強要によって,チームでの開発に役立つ
17
例(1)
Department of Information & communication science
18
SPC101のサーボモーターの位置と回転範囲
• インタフェースの定義
import ritsumei.airlab.spc101.*;
public interface Pose{
void setLed(RMotion rm);
void setPose(RMotion rm);
}
• インタフェースの実装
import ritsumei.airlab.spc101.*;
class RightHand1 implements Pose{
private String[] rightLED1 =
{"0000000", "2022202", "2020202", "2022202", "0000000"};
public void setLed(RMotion rm){
rm.setLED("RIGHT", rightLED1);
}
public void setPose(RMotion rm){
rm.setServo("RAM4", +90.0);
}
}
Department of Information & communication science
19
Department of Information & communication science
20
5
例(2)
• この例では,nameで与えられるクラスにsetLedとsetPoseがある
ことを保証しないといけない.
RMotion rm = new RMotion();
Pose ps;
public void motion(){
setFrame(new RightHand1());
rm.addFrame(1000);
rm.setMotion();
}
void setFrame(Pose ps){
ps.setLed(rm);
ps.setPose(rm);
}
Department of Information & communication science
21
6