以前あった質問の回答やネット上での説明を見たのですが、よくわからなかったので質問します。
public interface CharSequence {
int length();
}
class MyClassWithCharSequenceIF implements CharSequence {
public int length() {
return 0;
}
}
インターフェイスには、よく多重継承を可能にするメリットがあるという説明がありますが、
public interface CharSequence {
int length();
}
こんな短い処理を継承する意味があるのでしょうか?クラス内で実装するためにまた
public int length() {
return 0;
}
を書かなければならないのは時間・手間のメリットは何もないように思えます。というよりむしろ単なる二度手間ではないでしょうか?
クラスの継承は長い記述などを一まとめにして呼び出せるメリットがありますが、インターフェイスの継承にはそれがありません。
いったい何の意味があるんでしょうか?
No.1ベストアンサー
- 回答日時:
これはわりと大きい規模の開発なんかだと役にたつんですが
小規模で考えるとわかりにくいのかもです。
参考書によっては例があんまり意味なかったりしますね。
大きい規模での使い方を簡単に言うと
「○○関連のクラスにはこのメソッドを実装したい。
でもすでに他のクラスと親子でその関係が存在する」
なんてときです。
たとえばSportsクラスの子クラスにSoccer,BaseBall,Swim,Kendoがあって
GameクラスにIgo,Otheloがあったとします。
SportsとGameじゃ中身違いそうですよね。
でも結果を出力としたらどうでしょうか。スポーツだろうとゲームだろうと
対戦するものだろうとそうじゃないものだろうと「結果を出力する」という
ことには変わりません。
そんなときにたとえばResultというInterfaceを作ってprintResult()メソッドを定義します。
そして各クラスにResultをimplementsさせれば必ずそのメソッドがあるよと保障されるわけです。
それぞれのクラスを違う人が作っていたとしてもResultをimplementsしてねと
いればそれだけでそのメソッドが存在することになるのです。
そうすると各クラスを知らない人でも利用できますよね。
なんとなくイメージわいたでしょうか。
ご回答ありがとうございます。
Interfaceのメリットは一人で小規模なプログラムを書く分には実感できないということなんでしょうか。大規模なプログラムを多人数で製作するときに効果を発揮するものみたいですね。
大規模なプログラムだとクラスの外枠の製作者と中身を書く人が違うということがあるんですね!
自分の理解だと、Interfaceというのは「このクラスにはこのメソッドの処理を必ず書かなければならない。その意味でこのInterfaceを持ったクラス群は他のクラスと差異化されている。」ということを誰にも了解させるための「強制力をもった目印」という意味がある、ということだと思うんですがよろしいのでしょうか。
このことがわかったので、どこかのサイトに書いてあった「カプセル化」ということの意味もわかるような気がしてきました。
No.3
- 回答日時:
> Interfaceのメリットは一人で小規模なプログラムを書く分には実感できないということなんでしょうか。
小さい規模だと作ることはないかもしれませんね。
シリアライズのような形で使うことはあるかもしれません。
シリアライズについてはそのうち出てくると思うんで今はわからなくても問題ありません。
> 大規模なプログラムだとクラスの外枠の製作者と中身を書く人が違うということがあるんですね!
外枠というか、この場合だとSports系とGame系で違う人たちとかそんな感じのことはあります。
そういった場合にはそれぞれが違う実装になりそうな気がしますよね。
> 自分の理解だと、Interfaceというのは「このクラスにはこのメソッドの処理を必ず書かなければならない。その意味でこのInterfaceを持ったクラス群は他のクラスと差異化されている。」ということを誰にも了解させるための「強制力をもった目印」という意味がある、ということだと思うんですがよろしいのでしょうか。
そんな感じですね。親子とは関係なく一定の保障がされるわけです。
ただし中身は実装まかせなので何もしないものもあるかもしれません。
しかしからっぽでも「implementsしてあるクラスなら確実にそのメソッドが存在する」ということが保障されます。
いろんな人が作ってて、いろいろ仕様変更があってみんなのクラスをあわせたらコンパイルエラーが出ちゃったとか困りますよね。
まあからっぽというのは極端かもしれないんですが、メソッド内部の実装はあとから追加されたり変更されてもメソッド宣言が変わらなければ呼び出し側には影響ないということになります。
これはカプセル化につながりますね。
カプセル化の目的は隠蔽とか抽象化というやつです。
具体的に前の例を使うと、「結果を出力する」というメソッドの出力仕様を変えたくなった場合、出力メソッド内だけ変更すれば済むという状態であれば呼び出す側は仕様変更を気にしなくていいわけです。
「結果を出力する」ということに変わりはないわけですから、呼び出してる側はコードを変える必要がないんですね。
参考書にもこういう構成のクラスはありそうですね。
インターフェイスのことについてはだいたいつかめてきました。
横道に逸れたカプセル化のことまで回答してくれてありがとうございました。
No.2
- 回答日時:
> Interfaceというのは「このクラスにはこのメソッドの処理を必ず書かなければならない。
その意味でこのInterfaceを持ったクラス群は他のクラスと差異化されている。」ということを誰にも了解させるための「強制力をもった目印」という意味があるもっとシンプルに言えば
「あるinterfaceAがimplementsされているクラスには、必ず同じメソッドaがある」
ていうことよ。
さらにまとめると
「インターフェースを付与するということは、役割を持たせること」
と言うことになるんだけど。
うん、このほうが表現がオブジェクト指向っぽいわね。
もうちょっというと
実装上の意味があるかどうかなんて
インターフェースは、そのインターフェースを実装する人に
楽させるためのものじゃないからね。
インターフェースが実装されたクラスの利用者に楽させるものだから。
例としては、java.io.Serializableってあるじゃない。
これが実装されているクラスは確実にデータの復元が保証されるわ。
具体的に言うとリモートでオブジェクトごと転送できるってことね。
Serializableを実装していないオブジェクトを転送しようとすると
一旦文字列やバイナリデータに変換してから送信して
受信先で復元する、なんてことをしないといけないのよ。
このクラスはSerializableであるっていう役割を持たせることで
そのクラスの利用者は簡単にリモート転送できるようになるわ。
長くなるのでここで止めっ。
わからないことがあったら遠慮なく聞いてね。
>インターフェースは、そのインターフェースを実装する人に
>楽させるためのものじゃないからね。
やっぱりそういうことだったんですね。
やっとすっきりしました。
>java.io.Serializable
まだ全然知識がないので初耳でした。
調べてみたら、「インターフェイスの中にメソッドを書かないで空の状態で定義するもの」と書いてありました。インターフェイスというのは中にメソッドを書かなければ意味がないものと思っていたんですけど、名前自体で機能を持たせるインターフェイスもあったんですね。
機能はクラス内のデータの直列化≒保存
Javaもいろいろメソッドやインターフェイスやパッケージやらたくさんあって、機能をちゃんと覚えて使いこなすのは大変そうですね。
Javaは初めて学プログラミング言語だったのでオブジェクト指向の概念やプログラミングの世界独特の言い回し(「呼び出す」とか)に苦労していたんですが、なかでもインターフェイスは一番の強敵でした。
今回の回答で専門家の方から見れば浅い理解なのかもしれませんが大枠はつかめたような気がするので一安心できました。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# 関数ポインタの高速化のメリット 7 2023/05/05 20:15
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- Java Java 配列<選挙> 4 2023/07/31 15:07
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
抽象クラスをJUNITでテストする...
-
interface,extend,implementの...
-
「ラッパークラス」の存在意義...
-
Javaのインスタンス化の構文の...
-
オブジェクト指向のインターフ...
-
(vba)他のアプリケーションの右...
-
「継承されたメソッドの可視性...
-
「インターフェイス」って何の...
-
C言語のプログラムをJavaに
-
スタックで成績表を作るプログ...
-
JavaでのAPIの覚え方ってみさな...
-
バックグラウンドでキー監視
-
サブクラス型オブジェクトをス...
-
抽象クラスとインターフェース...
-
c++でのヘッダーファイルの循環...
-
C#からDLLを呼びたいのですが・...
-
VB初心者なのでわかりづらい説...
-
Javaで下線
-
Java難しすぎ
-
Javaでは多重継承ができない、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
interface,extend,implementの...
-
(vba)他のアプリケーションの右...
-
抽象クラスをJUNITでテストする...
-
「ラッパークラス」の存在意義...
-
ASP.NETでの共通コードの書き方...
-
JTextFieldの入力制限
-
「継承されたメソッドの可視性...
-
VB DLLプロジェクトについて
-
C# 「データが失なわれる可能性...
-
c++でのヘッダーファイルの循環...
-
【C#】クラスのコンストラクタ...
-
「IOException は対応する try ...
-
メソッドの引数にクラス名を渡す
-
ファイルパスが取得出来ない(P...
-
ゲッターを使わないで変数にア...
-
Javaのインスタンス化の構文の...
-
オーバーライドとラッパーの違い
-
vb.net 自作プロパティの削除に...
-
なぜインタフェースを使うのか?
-
VBがオブジェクト指向言語でな...
おすすめ情報