210 likes | 322 Views
イベントとリスナ. 05/18. 0.目次. インターフェイスとは? イベントとリスナとは?. 1-1.インターフェイスとは?. インターフェイスとは、“クラスが何をするか”を定義したもので、 実装は継承 (implements) したクラスに任せます. インターフェイス. クラス. 継承. // 料理を作るメソッド m eal cook( Shokuzai s,Kigu k){ // 食材を洗う // 器具で調理する : // 出来た料理を返す }. // 料理を作るメソッド m eal cook( Shokuzai s,Kigu k);.
E N D
イベントとリスナ 05/18
0.目次 • インターフェイスとは? • イベントとリスナとは?
1-1.インターフェイスとは? • インターフェイスとは、“クラスが何をするか”を定義したもので、実装は継承(implements)したクラスに任せます インターフェイス クラス 継承 //料理を作るメソッド meal cook(Shokuzais,Kigu k){ //食材を洗う //器具で調理する : //出来た料理を返す } //料理を作るメソッド meal cook(Shokuzais,Kigu k);
1-2.インターフェイスの利点は? • 1つのオブジェクトに複数の抽象的な型を持たせることができます • インタフェースの実装が変わっても、利用する側を変える必要がないので、再利用性・保守性が高くなります。
1-3.具体例 • まずインターフェイスを使っていなプログラムを見てみましょう(non_interfaceのパッケージ参照) 問題:自動販売機のプログラム • Customerクラス:メインクラス。お金を入れる • VendingMachineクラス:入れられた金額を計算し、ジュースの金額を以上になったら買えますと出力する • Coin10クラス:10円のクラス • Coin100クラス:100円のクラス
1-4.インターフェイスを使っていないプログラム1-4.インターフェイスを使っていないプログラム • 実行結果
1-4.インターフェイスを使っていないプログラム1-4.インターフェイスを使っていないプログラム 練習 • Coin10クラス、VendingMachineクラスを参考に50円玉、500円玉クラスを作り、自動販売機に入れられるようにしましょう Coin10クラス Vending Machineクラス getCoins(Coin10) getCoins(Coin50) getCoins(Coin100) getCoins(Coin500) Coin50クラス Coin100クラス Coin500クラス
1-4.インターフェイスを使っていないプログラム1-4.インターフェイスを使っていないプログラム • クラスが4つに増えるのは仕方ないが、今後1000円札などに対応すると、VendingMachineクラス内に似たメソッドがどんどん増えていく • 自動販売機にとって重要なのは、お金によって処理を変えるのではなく合計金額を計算してジュースを買えるかどうか判断すること
1-5.インターフェイスの導入 • そこで、各お金をインターフェイスを用いてCoinsという大まかな型を持たせましょう。 Coin10クラス Vending Machineクラス getCoins(Coins) Coin50クラス Interface Coins Coin100クラス Coin500クラス
1-6.インターフェイスの作り方 • 新規でクラスではなく、インターフェイスを選択する
1-7.インターフェイスの書き方 • 必要なメソッドの返り値と名前だけ書く //インターフェイス public interface Coins { //名前だけ宣言したメソッド public intgetMoney(); }
1-8.他のクラスでの継承 • インターフェイスは、他のクラスで継承(implements)しないと効果がありません • 継承したクラスでは、インターフェイス内で書いたメソッドを必ず実装します //インターフェイスを継承したクラス public class Coin10 implements Coins { @Override public intgetMoney() { return 10; } } //インターフェイス public interface Coins { //名前だけ宣言したメソッド public intgetMoney(); } public class Coin100 implements Coins { @Override public intgetMoney() { return 100; } }
1-9.VenderMachineクラスの書き換え • Coin10とCoin100クラスは、Coinsを継承したため以下の様な関係にあります • 大まかにいうと、どちらもCoins型のオブジェクトとして扱うことが可能です Coins Coin10 Coin100
1-9.VenderMachineクラスの書き換え // 10円を入れた時のメソッド static void getCoins(Coin10 coin) { // 金額をたす cost += coin.getMoney(); // ジュースを買えるか if (cost >= value) { // 買える時trueにする button = true; } // メッセージを出力 showMessage(); } // 50円を入れた時のメソッド static void getCoins(Coin50 coin) { // 金額をたす cost += coin.getMoney(); // ジュースを買えるか if (cost >= value) { // 買える時trueにする button = true; } // メッセージを出力 showMessage(); } : : : // お金を入れた時のメソッド static void getCoins(Coins coin) { // 金額をたす cost += coin.getMoney(); // ジュースを買えるか if (cost >= value) { // 買える時trueにする button = true; } // メッセージを出力 showMessage(); } お金の種類が50円、500円、1000円と増えようがVenderMachineクラスを書き換える必要はない
1-10.インターフェイスを使ったプログラム1-10.インターフェイスを使ったプログラム 練習 • Coin10クラスを参考に50円玉、500円玉クラスを作り、自動販売機に入れられるようにしましょう。ただし、インターフェイスを使うこと Coin10クラス Vending Machineクラス getCoins(Coins) Coin50クラス Interface Coins Coin100クラス Coin500クラス
2-1.イベントとリスナとは? • イベントとは、ボタンのクリックや、文字の入力などユーザーがオブジェクトを操作した事象をさし、ボタンやチェックボックスなどの操作された対象をイベントソースと言います クリック(イベント) イベントソース (ボタンなど)
2-1.イベントとリスナとは? • イベントが、発生するとイベントソースから複数のリスナに情報が送信されます。リスナでは、予め用意されたイベント処理メソッドを実装することで情報を取得できます リスナ クリックされたか検知するリスナ onClick() onLongPress() イベントソース 長押しされたか検知するリスナ
2-2.リスナインターフェイス • 各イベントには対応するリスナインターフェイスがあり、イベントの情報を取得するために用意されたメソッドを実装します。 • 例えば、ボタンをクリックした時に何か処理したい時はOnClickListenerを継承したクラスを作りonClickメソッド内に処理を書きます public class SampleClickListenerimplements OnClickListener{ @Override public void onClick(View v) { // ボタンクリックの処理 } } クリックした時にonClickメソッドが呼び出されるようにはしたので、実際に何をするかは自分で実装して Javaの設計者
2-3.リスナ登録 • 各イベント発生時の情報を取得する資格を得るためにはリスナ登録が必要で、それぞれon???Listenerという名前が付けられています onClickListernerを継承し、処理の内容を書いたクラス クリックされたかどうかのイベント情報を取得するためのリスナ登録 bt.setOnClickListener(new SampleClickListener()); イベントソース
2-3.リスナ登録 • リスナを継承したクラスを作らずに、以下のように登録することも可能です bt.setOnClickListener(new OnClickListener() { public void onClick(View v) { //ここに処理内容を書く } }); ;を忘れずに このような書き方を無名クラスといいます