- - PR -
インタフェースの間接実装
1
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-01-13 11:51
コレクションフレームワークのListおよびAbstractListは、
となっていて、これを実装するArrayListクラスは、
となっていると思います。 ここで質問なのですが、ArrayListはAbstractListクラスをextendsしている時点で、 既に間接的にListインタフェースをimplementsしていることになっていると思うのですが、 なぜわざわざ Listインタフェースもimplementsする宣言がなされているのでしょうか?
としただけの場合とは何か違うのでしょうか? | ||||||||||||||||
|
投稿日時: 2005-01-13 12:44
クラス構造からいえば、まったく違いはないです。 わざわざListをimplementsした意図は作った人に聞いてみないと分からないですが、 ArrayListがListインターフェースを実装していると、明示的に示したからでは、と推測します。 どうしても気になるなら、今はたまたまAbstractListがListインターフェースを実装している、けどもしかしたら将来AbstractListからListインターフェースがなくなるかもよ、と思っておくのはどうでしょう? # まずなくなることはないと思うけど。 | ||||||||||||||||
|
投稿日時: 2005-01-13 19:49
unibon です。こんにちわ。
私が以前に投稿した、 件名:java.util.Collection のメソッドがサブインターフェースの List にもあるのはなぜ? http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=7753&forum=12 と同じ疑問だと思います。 その時は、みなさまからご回答をいただきましたが、私としては、絶対にそうである(余計に implements List している)必要はないけど、そうなっていても害もないので、なんとなくそうなっているだけで、という考えに落ち付きました。 | ||||||||||||||||
|
投稿日時: 2005-01-14 10:40
かずくんさん、unibonさん、返答ありがとうございます。
似たようなスレッドが既にあったのですね。そちらもすべて読ませていただきました。 簡単に言えば「ArrayListはListをimplementsしていることを明確にするため。」ということで納得できました。 あちらのスレッドでかずくんさんが引用されているように、Joshua Blochの言う「実装の継承とインタフェースの継承の分離」ですね。 自分で設計したクラスでも、 例えばAというインタフェースを作成したら、このAをimplementsしたBという抽象クラスを作成して、Cという具象クラスを作る。 というパターンは往々にしてあると思いますが、このときも同様にCクラスはAインタフェースをimplementsするように書くべきなのでしょう。 どうもありがとうございました。 |
1