応用第4日目:インターフェース
インターフェース
インターフェースとは
第3日目の抽象クラスに似た概念として、インターフェースがあります。インターフェースは抽象メソッドのみを持つ特殊な型で、クラスが「何ができるか」という規約(仕様)を定めるために使用します。
Javaでは単一継承しかできませんが、インターフェースは複数実装することができます。これにより、1つのクラスが複数の機能を持つことを表現できます。
インターフェースの定義
interface インターフェース名 {
public 戻り値の型 メソッド名(引数);
}
public 戻り値の型 メソッド名(引数);
}
インターフェースの実装
class クラス名 implements インターフェース名1, インターフェース名2 {
// メソッドの実装
}
// メソッドの実装
}
サンプルプログラム
以下のサンプルでは、電話機能(IPhone)とメール機能(IEmail)の2つのインターフェースを携帯電話クラス(CellPhone)に実装します。
IPhone.java
package exday4;
public interface IPhone {
// 指定した番号に電話をかける
public void call(String number);
}
IEmail.java
package exday4;
public interface IEmail {
// メールを送る
public void sendMail(String address);
}
CellPhone.java
package exday4;
// 携帯電話クラス
public class CellPhone implements IPhone,IEmail{
// メールアドレス
private String mailAddress;
// 電話番号
private String number;
// コンストラクタ(メールアドレスと電話番号を設定)
public CellPhone(String mailAddress,String number){
this.mailAddress = mailAddress;
this.number = number;
}
// 指定したメールアドレスにメールを送信する
@Override
public void sendMail(String address){
System.out.println(address+"に、"+this.mailAddress+"からメールを出します。");
}
// 指定した番号に電話をかける
@Override
public void call(String number){
System.out.println(number+"に、"+this.number+"から電話をかけます。");
}
}
SampleEx401.java
package exday4;
public class SampleEx401 {
public static void main(String[] args) {
// 携帯電話クラスのインスタンスを生成
CellPhone cp = new CellPhone("hoge@email.com","090-1234-5678");
// 携帯電話クラスで、電話とメールを送る
cp.call("011-123-4567");
cp.sendMail("fuga@email.com");
// 電話インターフェースでインスタンスにアクセス。
IPhone phone = (IPhone)cp;
phone.call("011-987-6543"); // 電話をかける
// phone.sendMail("foo@email.com"); // メールの送信メソッドは利用できない。
// メールインターフェースでインスタンスにアクセス。
IEmail mail = (IEmail)cp;
mail.sendMail("bar@email.com"); // メールを出す
//mail.call("011-222-3333"); // mailインターフェースでは、電話の機能を利用できない。
}
}
011-123-4567に、090-1234-5678から電話をかけます。
fuga@email.comに、hoge@email.comからメールを出します。
011-987-6543に、090-1234-5678から電話をかけます。
bar@email.comに、hoge@email.comからメールを出します。
fuga@email.comに、hoge@email.comからメールを出します。
011-987-6543に、090-1234-5678から電話をかけます。
bar@email.comに、hoge@email.comからメールを出します。
CellPhoneクラスはIPhoneとIEmailの2つのインターフェースを実装しているため、電話とメールの両方の機能を持ちます。CellPhoneのインスタンスをIPhone型にキャストすると、IPhoneで定義されたcall()メソッドのみが使用できるようになります。同様にIEmail型にキャストするとsendMail()のみが使用できます。このようにキャストを活用することで、クラスが持つ機能を適切に制限することができます。(図4-1)
図4-1:クラスとインターフェースの関係性