インターフェイスを実装したクラスの型変換ができるのはなんでですか?
例えば、
interface Drinks{
void print();
}
class Tea implements Drinks{
int money;
Tea(int money){
this.money = money;
}
void print(){
System.out.println(money +"円");
}
}
class Inter{
public static void main(String[] args){
Drinks drinks = new Tea(200);
Tea tea = new Tea(200);
drinks.print();
tea.print();
}
}
の様なコードがあったとして
Drinks drinks = new Tea();
はなんかおかしく感じるのですが。。
Tea型のクラスとして生成されたインスタンスが、インターフェイスであるDrinks型の変数drinksに代入できるということは、変数drinksは、Drinks型でありTeaクラスの実体を参照できるということですか??
そして
drinks.print(); と tea.print(); の違いがはっきりとわからないんですが、よろしくお願いします!
ちなみにコンパイル通してないんで実行できるか確かではないですが言いたいことが伝わればいいのでそこんとこよろしくお願いします!
No.2ベストアンサー
- 回答日時:
# おいらはC#のinitiateに過ぎないし、C#とJavaとはことなるところもあるだろうけど、インタフェースについては似たようなものだと思うので書いてみる。
インターフェースというのはC++における純粋仮想関数のみで構成される抽象クラスと考えるべきだというのをどっかで読んだことがあるなぁ。
Drinkというインターフェースは「飲み物」という抽象的な性質・特性をあらわしていて、それを特徴付けるものが定義されているメソッド。
Drinkを実装するクラスは「飲み物」という特性を持っているということになる。
Drinkを実装しているクラスのインスタンスをDrink型の変数に代入すると、それはDrinkとしか扱われないというのが重要なんだと思う。Drinkで定義されているメソッド(操作)のみが見えている。
よりわかりやすいのが、インタフェース型を引数としてとる関数かも知れない。
Drink型の引数にはDrinkを実装したクラスの変数を渡すことが出来る(はず)。
つまり、「飲み物」ならばソフトドリンクであろうがアルコール飲料であろうが何でも受け付けて、その関数の中では(原則的に)インタフェースに定義されたメソッドを使って処理が行われる。
繰り返すようだけど、同じ性質・特性・概念を持つものを統一的に扱うことが出来るってことだろうかと。
# ただ、これが上手くできるようにするにはインタフェースにどのようなメソッドを定義するかを十分に考えてやらないといけないんだろうけどね。
この回答への補足
返事が遅くなりましたが、なるほどです。参考になります!
つまり車で例えると、基本はエンジン、ボディー、タイヤがすべてに共通するものであり、それらをインターフェイスのメソッドとするならば、
多種ある車ごと(car1,car2,...,carnとおく)のクラスがあり、それらの車のクラスで、エンジンの排気量や静音性や熱効率、ボディーの形状や色、タイヤの摩擦や大きさといった特性を定めることになる。ということですよね。
プログラム上ではcar1をインターフェイスに渡すということはcar1型という仕様書を生産工場に渡すということなんですね。
つまりどんな型でも受け入れられる抽象型がインターフェイスといった感じですか。
No.3
- 回答日時:
一つ思いついたんだけどね。
上手く使うと、コンパイル時の型チェックで、ファンクションなどに変なパラメタを渡す等のエラーが減ったりするんじゃないかなぁって。
あなたの例だと、飲み物でない値を飲み物を扱うファンクションに渡そうとするとコンパイルエラーが発生すると。
あと、個人的にはprint()なんていうメソッドをインタフェースに入れているのはどうかと思う。それはメインの継承の軸の方に入れるべきでは無かろうかと。(おそらくは大本のクラスに)
インタフェースにはそのインタフェースが示す概念と切っても切り離せないものを宣言しておくべきであろうかと。
# 「表示する」というのが「飲み物」という*概念*に近接しているとはとても思えない。
もしかすると、そんなクラス・インタフェース設計を例として使っちゃったところが、理解を妨げてしまっているのではないかとも思える。
No.1
- 回答日時:
>変数drinksは、Drinks型でありTeaクラスの実体を参照できるということですか??
そうですね。「お茶」は「飲み物」として扱うことができると考えることができます。
>drinks.print(); と tea.print(); の違いがはっきりとわからないんですが、よろしくお願いします!
動作の実態は同じです。
「飲み物」として扱うか、「お茶」として扱うかの違いになります。
プログラム上では、より汎用的な「飲み物」として扱うことにより、
状況に応じて「お茶」や「コーヒー」等を扱うことができることになります。
「お茶」と特定せずに「飲み物」とすることで、扱う品目を容易に増やしたり、
別の飲み物に対応させたりすることが可能になります。
回答ありがとうございます。
つまりインターフェイスであるDrinksは可変的で柔軟だから、それを実装するクラスはDrinks型に型変換できるというイメージでいいんでしょうか。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java final 1 2022/06/10 22:49
- 英語 TOEIC公式問題集7に記載の英文で質問があります。 Please refrain from eat 4 2023/01/19 03:35
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- iCloud 料金 3 2022/07/21 13:54
- その他(メンタルヘルス) 夫と話してて話にならないことが多いです。私が変なのでしょうか。どうすればいいですか? 今朝、私がスマ 4 2023/07/24 05:46
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- 英語 英語の質問 3 2023/03/18 12:07
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- 英語 画像の問題の(8)と(9)は*(こめじるし)が付いていない単語の方が正しい答えということですよね? 1 2023/06/08 20:33
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】看板の文字を埋めてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・【穴埋めお題】恐竜の新説
- ・我がまちの「給食」自慢を聞かせてっ!
- ・冬の健康法を教えて!
- ・一番好きな「クリスマスソング」は?
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
オーバーライドとラッパーの違い
-
setTextについて
-
Ftpでの帯域制限の設定方法につ...
-
【C#】クラスのコンストラクタ...
-
C# 「データが失なわれる可能性...
-
「継承されたメソッドの可視性...
-
メソッドの引数にクラス名を渡す
-
interfaceとabstract
-
委譲って何ですか?
-
親クラスのメソッドを別のパッ...
-
C#からDLLを呼びたいのですが・...
-
WindowsアプリケーションのASP....
-
(vba)他のアプリケーションの右...
-
VBがオブジェクト指向言語でな...
-
ASP.NETでの共通コードの書き方...
-
サーバー上のフォルダ情報の取得
-
インターフェイス 型変換 クラス
-
Javaでのジェネリクス型パラメ...
-
Excel vbaのプログラムでガンマ...
-
JTextFieldの入力制限
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
(vba)他のアプリケーションの右...
-
interface,extend,implementの...
-
C# 「データが失なわれる可能性...
-
「継承されたメソッドの可視性...
-
JTextFieldの入力制限
-
Javaのインスタンス化の構文の...
-
ASP.NETでの共通コードの書き方...
-
VB DLLプロジェクトについて
-
抽象クラスをJUNITでテストする...
-
【C#】クラスのコンストラクタ...
-
メソッドの引数にクラス名を渡す
-
C#からDLLを呼びたいのですが・...
-
「ラッパークラス」の存在意義...
-
vb.net 自作プロパティの削除に...
-
「IOException は対応する try ...
-
c++でのヘッダーファイルの循環...
-
JavaでのAPIの覚え方ってみさな...
-
Commons-Discovery.jarとは?
-
setTextについて
-
オーバーライドとラッパーの違い
おすすめ情報