応用第4日目:インターフェース

インターフェースを使った設計を学びます。interfaceキーワード、implementsによる実装、複数インターフェースを確認します。

応用 1 2 3 4 5 6 7

応用第4日目:インターフェース

インターフェース

インターフェースとは

第3日目の抽象クラスに似た概念として、インターフェースがあります。インターフェースは抽象メソッドのみを持つ特殊な型で、クラスが「何ができるか」という規約(仕様)を定めるために使用します。

Javaでは単一継承しかできませんが、インターフェースは複数実装することができます。これにより、1つのクラスが複数の機能を持つことを表現できます。

インターフェースの定義
interface インターフェース名 {
  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からメールを出します。

CellPhoneクラスはIPhoneとIEmailの2つのインターフェースを実装しているため、電話とメールの両方の機能を持ちます。CellPhoneのインスタンスをIPhone型にキャストすると、IPhoneで定義されたcall()メソッドのみが使用できるようになります。同様にIEmail型にキャストするとsendMail()のみが使用できます。このようにキャストを活用することで、クラスが持つ機能を適切に制限することができます。(図4-1)

クラスとインターフェースの関係性

図4-1:クラスとインターフェースの関係性

練習問題 応用4 へ →