[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] Re: インターフェースについて




>初めまして、大石と申します。
>今回、初めて投稿させていただきます。

ようこそ Java 互助会へ。

>最近、Javaを勉強し始め、ようやく簡単なプログラムは組めるようになりました。
>しかしながら、いまいちインターフェースの使い道が分からず困っています。
>自分でインターフェースを記述して、インプリメントする事のメリット、若しく
>は、こんな時にインターフェースを使用すれば、効率よくプログラムを作成でき
>る等、ありましたら教えていただけないでしょうか。

私も Java をメインの開発言語にしてから半年くらいは、
interface のどこがどう便利なのか良く分からなかったです。

最近やっと便利さが分かってきたような気がしているのですが、
いざそれを説明しようとするととても説明しにくいと感じています。

実例をもとに説明しようとしても、
かなり複雑な説明になってしまうことが多いです。

『Peter Coadによる Javaオブジェクト設計』は interface について
1章を割いて説明していますが、この本は初心者向けとは言い難いです。

一つ言えることは、interface は「型」だ、ということです。

interface Address {
  void setAddress(String value);
  String getAddress();
}

こんな intarface があったとして、

Address anyobject;

こういう変数を宣言したとき、
この変数はある条件を満たしたオブジェクトを代入できるようになります。

その条件とは「Address インターフェースを implements していること」
ということだけで、どのような定義のオブジェクトなのかは関係ありません。

ここに代入されるオブジェクトは、setAddress(), getAddress() という
メソッドを持っていることが保証されますから、

  String theaddress = anyobject.getAddress();
 
とか、

  anyobject.setAddress("青森県北津軽郡東京村");

というようなメソッド呼び出しが出来ることが保証されます。

これはとくに、メソッドの引数や、メソッドの戻り値に intarface 型を
使ったときに威力を発揮します。

class AddressManager {

  private Vector addresses = new Vector();
  
  public void addAddress(Address anyaddress) {
    addresses.addElement(anyaddress);
  }

  public Address getAddressAt(int i) {
    return (Address)addresses.get(i);  // java.lang.Object が返るのでキャストする
  }

  public void showAll() {
    Enumeration e = addresses.elements();
    while (e.hasMoreElements()) {
      Address oneaddress = (Address)e.nextElement();
      String theaddress = oneaddress.getAddress();
      System.out.println(theaddress);
    }
  }
}

別の質問であった、
「複数の値をまとめてメソッドの戻り値として戻したい」についても、

  ・class を定義してそれを戻すことも可能ですが、
  ・interface を定義してそれを戻しても実現できます。

リモートオブジェクトのメソッドを呼ぶときも interface は便利です。
そのオブジェクトがローカル・コンピューターにあろうが、
ネットワーク経由で地球の裏側にあろうが、木星軌道上にあろうが、
同じメソッドを呼ぶことが出来ます。
-- 
えんどう やすゆき <yasuyuki@xxxxxxxxxx>
http://www.javaopen.org/jfriends/ (Java互助会ホームページ)