本日のトピック アップキャスト ポリモーフィズム オブジェクト指向概論 ーポリモーフィズムー 継承を利用した方法 インタフェースを利用した方法 情報理工学部 情報コミュニケーション学科 小川 均 [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
© Copyright 2024 ExpyDoc