プロが教えるわが家の防犯対策術!

最近サーブレットをいじっているので例としてサーブレットを扱いますが、一般的な話題として扱っていただければと存じます。

非常に質問を文章化しにくいのですが・・ たとえば、クラスHttpServletには以下のようなメソッドがあります。

doGet(HttpServletRequest req, HttpServletResponse resp)

このメソッドの引数に指定されているHttpServletRequest/Responseはいずれもインタフェースなわけですが、メソッドの引数にインタフェースを指定するというのは、具体的にどういうことなのでしょうか? これがたとえばintだったりStringだったりした場合は簡単にイメージできるのですが、インタフェースだとさっぱりわかりません。
質問がわかりにくいかもしれませんが、よろしくお願いいたします。

A 回答 (4件)

よくやるのはMapとか。


例えば次のようなメソッドがあったとして

doMethod(Map m){}

これはHashtableを引数にとることもできるし、
HashMapを引数にもできます。

Hashtable ht = new Hashtable();
HashMap hm = new HashMap();

// どっちもOK
doMethod(ht);
doMethod(hm);

正しく言うと、Mapインターフェースを実装したクラスの変数を
引数に取ることができるのです。

仮にこれができなかった場合
doMethodにHashtableとHashMap両方の引数を
取れるようにしようとすると

doMethod(Hashtable ht){}
doMethod(HashMap hm){}

というように処理は同じなのに
引数の取りたいクラス型の数だけメソッドを
準備しなくてはならなくて面倒ですよね?

インターフェースを実装すると
そのインターフェースで定義されたメソッドを
必ず定義しなくてはいけません。
つまり、逆に言うとインターフェースが実装されていると
そのメソッドを持っていることが保証されるわけで
同じようなクラスに対する共通的な処理をひとつのメソッドで
まとめることができるメリットがあります。
    • good
    • 1
この回答へのお礼

勉強不足で、おっしゃっていることの意味があまり理解できません(汗)
ともあれ、以下の点は理解できました。ありがとうございます。

>正しく言うと、Mapインターフェースを実装したクラスの変数を
>引数に取ることができるのです。

お礼日時:2010/02/20 02:41

すみません, もちろん「実装」です.


あと, たとえば「データをソートする」メソッドではだいたいインターフェース Comparator を引数に持ちます. こうすることで, ソートするときの順序をユーザが自由に決められます.
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。大変参考になりました。

お礼日時:2010/02/23 23:01

#2です。


もうひとつ大事なメリットを書き忘れたので追記です。

例えばあなたがHashMapを機能拡張した
HashMapOrgクラスを作成したとします。

Class HashMapOrg extends HashMap{}

先ほどのdoMethodは、
このHashMapOrg型の変数も
引数として取ることができます。

HashMapOrg hmo = new HashMapOrg();

doMethod(hmo);

もちろんMapインターフェースを実装したクラスでも
OKです。

Class HashMapOrg imprements Map{省略}


つまり、引数にインターフェースを指定することによって
今後同じインターフェースを持つ新しいクラスができても
そのクラス型の変数もまた引数にとることができます。
つまり、新たに

doMethod(HashMapOrg hmo){}

というメソッドを必ずしも追加しなくても良くなるので
メソッドを持つクラスを修正する必要がなくなるメリットがあります。
    • good
    • 1

そのインターフェースを実現している任意のクラスのオブジェクトを渡すことができる.

    • good
    • 1
この回答へのお礼

実現とは、実装という理解でよろしいですか?

お礼日時:2010/02/20 02:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!