アプリ版:「スタンプのみでお礼する」機能のリリースについて

以前あった質問の回答やネット上での説明を見たのですが、よくわからなかったので質問します。

public interface CharSequence {
int length();
}
class MyClassWithCharSequenceIF implements CharSequence {
public int length() {
return 0;
}
}

インターフェイスには、よく多重継承を可能にするメリットがあるという説明がありますが、
public interface CharSequence {
int length();
}
こんな短い処理を継承する意味があるのでしょうか?クラス内で実装するためにまた
public int length() {
return 0;
}
を書かなければならないのは時間・手間のメリットは何もないように思えます。というよりむしろ単なる二度手間ではないでしょうか?
クラスの継承は長い記述などを一まとめにして呼び出せるメリットがありますが、インターフェイスの継承にはそれがありません。
いったい何の意味があるんでしょうか?

A 回答 (3件)

これはわりと大きい規模の開発なんかだと役にたつんですが


小規模で考えるとわかりにくいのかもです。
参考書によっては例があんまり意味なかったりしますね。

大きい規模での使い方を簡単に言うと
「○○関連のクラスにはこのメソッドを実装したい。
 でもすでに他のクラスと親子でその関係が存在する」
なんてときです。

たとえばSportsクラスの子クラスにSoccer,BaseBall,Swim,Kendoがあって
GameクラスにIgo,Otheloがあったとします。
SportsとGameじゃ中身違いそうですよね。
でも結果を出力としたらどうでしょうか。スポーツだろうとゲームだろうと
対戦するものだろうとそうじゃないものだろうと「結果を出力する」という
ことには変わりません。

そんなときにたとえばResultというInterfaceを作ってprintResult()メソッドを定義します。
そして各クラスにResultをimplementsさせれば必ずそのメソッドがあるよと保障されるわけです。
それぞれのクラスを違う人が作っていたとしてもResultをimplementsしてねと
いればそれだけでそのメソッドが存在することになるのです。
そうすると各クラスを知らない人でも利用できますよね。
なんとなくイメージわいたでしょうか。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
Interfaceのメリットは一人で小規模なプログラムを書く分には実感できないということなんでしょうか。大規模なプログラムを多人数で製作するときに効果を発揮するものみたいですね。

大規模なプログラムだとクラスの外枠の製作者と中身を書く人が違うということがあるんですね!
 自分の理解だと、Interfaceというのは「このクラスにはこのメソッドの処理を必ず書かなければならない。その意味でこのInterfaceを持ったクラス群は他のクラスと差異化されている。」ということを誰にも了解させるための「強制力をもった目印」という意味がある、ということだと思うんですがよろしいのでしょうか。
このことがわかったので、どこかのサイトに書いてあった「カプセル化」ということの意味もわかるような気がしてきました。

お礼日時:2009/04/07 08:05

> Interfaceのメリットは一人で小規模なプログラムを書く分には実感できないということなんでしょうか。



小さい規模だと作ることはないかもしれませんね。
シリアライズのような形で使うことはあるかもしれません。
シリアライズについてはそのうち出てくると思うんで今はわからなくても問題ありません。

> 大規模なプログラムだとクラスの外枠の製作者と中身を書く人が違うということがあるんですね!

外枠というか、この場合だとSports系とGame系で違う人たちとかそんな感じのことはあります。
そういった場合にはそれぞれが違う実装になりそうな気がしますよね。

> 自分の理解だと、Interfaceというのは「このクラスにはこのメソッドの処理を必ず書かなければならない。その意味でこのInterfaceを持ったクラス群は他のクラスと差異化されている。」ということを誰にも了解させるための「強制力をもった目印」という意味がある、ということだと思うんですがよろしいのでしょうか。

そんな感じですね。親子とは関係なく一定の保障がされるわけです。
ただし中身は実装まかせなので何もしないものもあるかもしれません。
しかしからっぽでも「implementsしてあるクラスなら確実にそのメソッドが存在する」ということが保障されます。
いろんな人が作ってて、いろいろ仕様変更があってみんなのクラスをあわせたらコンパイルエラーが出ちゃったとか困りますよね。

まあからっぽというのは極端かもしれないんですが、メソッド内部の実装はあとから追加されたり変更されてもメソッド宣言が変わらなければ呼び出し側には影響ないということになります。
これはカプセル化につながりますね。

カプセル化の目的は隠蔽とか抽象化というやつです。
具体的に前の例を使うと、「結果を出力する」というメソッドの出力仕様を変えたくなった場合、出力メソッド内だけ変更すれば済むという状態であれば呼び出す側は仕様変更を気にしなくていいわけです。
「結果を出力する」ということに変わりはないわけですから、呼び出してる側はコードを変える必要がないんですね。
参考書にもこういう構成のクラスはありそうですね。
    • good
    • 0
この回答へのお礼

インターフェイスのことについてはだいたいつかめてきました。
横道に逸れたカプセル化のことまで回答してくれてありがとうございました。

お礼日時:2009/04/07 17:16

> Interfaceというのは「このクラスにはこのメソッドの処理を必ず書かなければならない。

その意味でこのInterfaceを持ったクラス群は他のクラスと差異化されている。」ということを誰にも了解させるための「強制力をもった目印」という意味がある

もっとシンプルに言えば
「あるinterfaceAがimplementsされているクラスには、必ず同じメソッドaがある」
ていうことよ。
さらにまとめると
「インターフェースを付与するということは、役割を持たせること」
と言うことになるんだけど。
うん、このほうが表現がオブジェクト指向っぽいわね。


もうちょっというと
実装上の意味があるかどうかなんて
インターフェースは、そのインターフェースを実装する人に
楽させるためのものじゃないからね。
インターフェースが実装されたクラスの利用者に楽させるものだから。


例としては、java.io.Serializableってあるじゃない。
これが実装されているクラスは確実にデータの復元が保証されるわ。
具体的に言うとリモートでオブジェクトごと転送できるってことね。
Serializableを実装していないオブジェクトを転送しようとすると
一旦文字列やバイナリデータに変換してから送信して
受信先で復元する、なんてことをしないといけないのよ。
このクラスはSerializableであるっていう役割を持たせることで
そのクラスの利用者は簡単にリモート転送できるようになるわ。


長くなるのでここで止めっ。
わからないことがあったら遠慮なく聞いてね。
    • good
    • 0
この回答へのお礼

>インターフェースは、そのインターフェースを実装する人に
>楽させるためのものじゃないからね。
やっぱりそういうことだったんですね。
やっとすっきりしました。

>java.io.Serializable
まだ全然知識がないので初耳でした。
調べてみたら、「インターフェイスの中にメソッドを書かないで空の状態で定義するもの」と書いてありました。インターフェイスというのは中にメソッドを書かなければ意味がないものと思っていたんですけど、名前自体で機能を持たせるインターフェイスもあったんですね。
機能はクラス内のデータの直列化≒保存

Javaもいろいろメソッドやインターフェイスやパッケージやらたくさんあって、機能をちゃんと覚えて使いこなすのは大変そうですね。
Javaは初めて学プログラミング言語だったのでオブジェクト指向の概念やプログラミングの世界独特の言い回し(「呼び出す」とか)に苦労していたんですが、なかでもインターフェイスは一番の強敵でした。
今回の回答で専門家の方から見れば浅い理解なのかもしれませんが大枠はつかめたような気がするので一安心できました。
ありがとうございます。

お礼日時:2009/04/07 16:50

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