下記の質問と重複するかもしれませんが・・・・
①「多態性」と「抽象クラス」は同じ意味ということですが、なぜ一緒じゃないんですか?
②多態性の大体のイメージ=多数の独自規格→規格統一のみたいな感じ? (イメージ的に似ているが・・・)
オブジェクト指向を勉強している者です。頭があれでして、さらに説明が下手ですいませんが
インターフェースが使えて何が嬉しいのか?その「メリット」と「デメリット」について
上記の質問にて
カセットコンロとそのボンベの規格が、1998年の阪神淡路大震災をきっかけに統一されたことはご存知でしょうか?
それまではメーカーごとに独自の規格を持っていたため、ボンベの貸し借りなどができず、不便な状況になっていたのです。
規格が統一されたことにより、(完全ではありませんが)コンロと異なるメーカーのボンベでも使うことが可能となり、非常に使いやすくなったのです。
これに限らず、DVDやUSBなどはルールを統一しているからこそ、広く利用されるようになったのです。
と書かれており、さらには
多態性の大体のイメージ=多数の独自規格→規格統一のみたいな感じ? (イメージ的に似ているが・・・)
上記の内容には
「多数の独自規格」→「規格統一」→使いやすくなる
と書かれているたのですが、
上記の画像のどおり、「統一の点」では同じですが、
この**「多態性」と「インターフェース」はどこが違う**のでしょうか?
私からすれば**「多態性」「インターフェース」は同じようなものしか見えない**のですが・・・
つまり、こういうことなんでしょうか?
上記のような感じでしょうか?
(できれば)カセットコンロとそのボンベの規格みたいに、日常的に例えたもののほうがわかりやすいです。
さらにイメージを提示していただけると、すごく理解しやすいです。
説明が下手で失礼しますが、回答のほうお願いいたします。
(追記)
いろいろ遅くなりすいません。質問の回答のほうを見てもう一度考えたのですが、イメージとしてはこんな感じでよろしいのでしょうか?(説明が判りにくいと思うので図式化してみました。何度もすいません。)
(7月8日追記)
いろいろ遅くなりすいません。質問の回答のほうを見て、もう一度ゼロから考えたのですが、イメージとしてはこんな解釈でよろしいのでしょうか?
(説明が判りにくいと思うので図式化してみました。何度もすいません。)
(7月19日追記)
いろいろ遅くなりすいません。皆さん本当にコメントありがとうこざいます。
私自身もいろいろ、理解が進まず皆さんにご迷惑をおかけしました。
仕事で忙しくなかなかじっくり読むことが出来ず、さらに読み漏れが多発していることもあり、私自身もかなり誤解をしてしまいました。
それで、もう一度考えたのですが、例えると
多態性:「iphone」で発売前には想像もしなかったアプリやアクセサリが登場した
インターフェース:継承の一部に入り、交換可能なパーツを作成するために共通点を「規格」としてまとめ上げられる
イメージとしてはこんな解釈でよろしいのでしょうか?何度もすいません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/09 02:09
2018/07/18 21:18
2018/07/18 21:20
2018/07/19 02:14
2018/07/23 22:56
2018/07/23 22:58 編集
2018/07/24 05:26
2018/07/24 16:18

回答8件
0
ベストアンサー
このyonaさんの回答でも言われていますが、目的と手段を混同しています。
インタフェースは多態性を表現するいち手段である、というだけの話です。
改めて関連質問を見返してみると、あちこちでこれと類似した回答が出ているにも関わらず、同じような質問で右往左往しているようなので、**上記の回答で何が不明なのかをまず説明してください。**この説明に対するリアクションがない限り、同じような回答の繰り返しにならざるを得ません。
7/24追記 7/19質問追記と7/24質問編集依頼欄への質問者コメントを受けて
質問者が回答者の回答をほぼ拒絶しているようなので、おそらくこの質問に対する最後の編集になるかと思います。
私含め、回答者は以下のことを答えています。
- インタフェースは多態性を表現するいち手段である
- 多態性は概念の話であり、イメージで伝えるのはほぼ不可能
- たとえ話は初学者には誤解のもと
これらのことを伝えているにも関わらず、いまだにイメージやたとえ話にこだわって「これで合ってるの?」と言われても無理です。そもそもそのイメージ(iPhoneの例え)もちゃんと多態性を理解するものになっていますか?
イメージで伝えるのが不可能であるのと同様、イメージで理解しているかどうかを解釈するのが無理です。少なくとも「これこれこういう点が多態性」という説明がないと、正しいかどうかの判断はできません。
結局、私が最初から主張する「インタフェースは多態性を表現するいち手段である」で多態性とインタフェースの関係性はほぼ完結しています。「イメージをつかまないと理解できない」というのは逃げか怠けです。全体をつかまないと、と言っていますが、たとえ話は全体像なんかではなく、むしろ細部の話です。
だからこそ、インタフェースは多態性を表現するいち手段であるという文をそのまま理解してほしいのです。理解できないならその理解できないところを教えてくれと言っているのです。それが無いせいで、やはり同じ話の繰り返しになっています。
質問で「頭があれで」と言っていますが、あなたの問題はそれ以前に文章をきちんと理解しようとしていないことです。この質問の一連のやり取りを見ていると、理解できないところや興味ないところなどを一切読んでいないかのような受け答えが多数見られます。回答者が読んでほしいところをまるっと無視されて質問されているようで、空しいばかりです。
以下、回答時に付けた蛇足
多態性は「1つのメソッドが複数のふるまいをする」という機能のことを指します。
これを表現するための1つの手法として、インタフェースという仕組みを使っているのです。インタフェースにメソッド名だけを定義し、実装先のクラスで好き好き実装を書くことで、「インタフェースに定義された1つのメソッドが、それを実装するクラスによってさまざまなふるまいをする」という多態性を実現しているのです。
日常的な例えで説明してくれるとありがたいです。
そもそも、多態性と言っているのですから、性質のこと、抽象的な概念の話になるのです。これを日常的な例えで言おうとした瞬間、それは抽象論ではなく具体的な何か、すなわちここで言うインタフェースの話になります(ここで言う「具体的な」というのは、多態性を実現するための方法論としての話であり、「インタフェースが中身のない抽象メソッドを持つもの」という話とはまた異なるものであることに注意)。
追記 どうしてもMIDIで説明が欲しいようなので
(正直MIDIに関してそこまで知識があるわけではないので細かいところは突っ込まないでいただきたい)
7/12追記
MIDIだと説明しづらいので、「楽器」で例を出します。楽器の中でも、「ドレミファソラシド」の音階が出せるものに限定して考えます(つまり、ドラムやシンバルなどは除外)。ピアノ、ギター、リコーダーなど様々ありますね。
当然、それぞれの楽器で音の出し方は異なります。ピアノだったら「鍵盤を押す」、ギターだったら「弦を押さえて弾く」、リコーダーだったら「穴をふさいで吹く」といった具合に。
でも、実際に演奏する場面を想像してください(もちろん、各奏者は音の出し方を熟知しているという前提で)。ピアノの奏者に「この鍵盤を押して」とか、ギターの奏者に「この弦のこの場所を押さえて弾いて」とか、リコーダー奏者に「この穴とこの穴をふさいで吹いて」なんて指示しませんよね?楽譜を渡すのではないでしょうか?もっと言えば、「『ド』の音を出して」のような指示になるのではないでしょうか?
「『ド』の音を出して」と指示されれば、それぞれの奏者はそれぞれの楽器に対応した音の出し方で音を出します。指示は1つですが、楽器ごとにその指示の実行の仕方が異なる。このような性質のことを多態性と呼んでいるのです。
では、こういった関係をJavaのプログラミングで実現しようと考えます。上記のようなことは、思っただけでは実現できません。Javaは静的型付けの言語ですから、通常ならばピアノならピアノ、ギターならギターとしてしか扱えず、上記のような「複数の楽器に対して1つの指示で制御する」といった使い方ができません。
実現するために使う方法の1つがインタフェースという仕組みです。仮想的にコードを組むとしたらこんな感じでしょうか。
java
1interface 楽器 { 2 void play(int 音階); 3} 4 5class ピアノ implements 楽器 { 6 public void play(int 音階) { 7 音階に対応する鍵盤を押す; 8 } 9} 10 11class ギター implements 楽器 { 12 public void play(int 音階){ 13 弦を押さえて弾く; 14 } 15} 16 17class リコーダー implements 楽器 { 18 public void play(int 音階) { 19 穴を押さえて吹く; 20 } 21}
こうすることでピアノもギターもリコーダーもすべて「楽器」として扱うことができ、「楽器」の型に入れることで(その型に実際はどんな楽器が入っていようとも)playメソッドという1つの指示で複数の楽器の指示ができるという多態性を実現できる、というわけです。
投稿2018/07/01 15:51
編集2018/07/24 01:40総合スコア20673
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/02 01:50
2018/07/02 02:32

退会済みユーザー
2018/07/02 06:36

退会済みユーザー
2018/07/06 10:19 編集
2018/07/06 11:18

退会済みユーザー
2018/07/10 17:49

0
プログラミング上の概念を身近なもので例えるのは、
すでにわかっている人が「なるほど確かにそういう一面もあるな面白い面白い」というような遊びには向いてますが、
むしろ初学者には誤解の原因にしかならないと思っています。(MIDI規格で一生懸命考える今のあなたのように)
プログラムのことはプログラムで考えたほうがいいです。
それはさておき、
多態性とは、「命令したら、命令を受けた側が持っている処理がなされる」ぐらいの広い概念です。
(プログラミングで言う)インターフェースは、多態性をプログラムで表現するための方法のひとつです。
となると、多態性と、多態性のプログラムでの実現方法(インターフェース)を、
現実世界で例えたら当然どちらも同じように見えてしまいます。
投稿2018/07/02 02:52
総合スコア13553
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
解説としては swordone さんの回答が完璧すぎて、これ以上書いても蛇足だな、という感じです。(それでもあえて回答を書くのは、重ねて言っていくしかない、と思ったからです)
YAMAHA KAWAI KORG MIDI形式の例の画像の右側が決定的に勘違いしています。不要です。
多態性は「ある種のふるまいを記述する方法があってその方法に則って記述するのだけど、そのふるまいがどのようにおこなわれるかは記述する時点では問わない。そのふるまいを実際におこなう時にどうおこなうかが決められる(を決める)」という性質です。
swordone さんは "「1つのメソッドが複数のふるまいをする」という機能"と書きました。
ozwk さんは"「命令したら、命令を受けた側が持っている処理がなされる」ぐらいの広い概念"と書きました。
ku_ra_geさんは"同じ名前のメソッドを呼び出した時に、実行される処理がインスタンスの種類によって変わるという機能を指す言葉です"と書きました。
全部合ってます。
全員が同じ概念を共有しています。
見ている側面や語る言葉が違うだけです。
YAMAHA KAWAI KORG MIDI形式の例だと画像の左側で、「MIDI形式に則って書けばYAMAHAの機械でも、KAWAIの機械でも、KORGの機械でも、同じ音楽が鳴らせる」という状態が成立しています=そのような性質を保有しています。
そのような性質が多態性です。
そのような性質を具体的に実現するための仕組みがインタフェースです。
インタフェースは多態性を表現するいち手段であるというのはそういうことです。
図の右側は不要です。頭のなから消してください。
で、仮に、例えば「MIDI形式のアナロジーについてはわかった」となったとしましょう。
問題は「じゃあJavaではどういうことになるの?」となることです。
そこにはギャップがあります。
そのギャップを埋めるにはJavaのコードを書くか読むかする以外にないです。
よくわからないから日常的なもので例えようとするから理解から遠くなるんです。
(これも、みんなが、同じ事を、何度も何度も、言っていますね。私も、そう言ってあげるべきだと思うので、書きます)
コメントにいくつか答えてたので勘違いされると困るので追記しますが、私の回答は
そのギャップを埋めるにはJavaのコードを書くか読むかする以外にないです。
よくわからないから日常的なもので例えようとするから理解から遠くなるんです。
ですからね。
喩えというものは
コードという実例をたくさん読み書きして、その上でそれらに共通する/それらが内包する概念を獲得しようとするその時に、具象から抽象を掴み取る手助けになる
だけです。
あるいは
先に喩えで考えてもいいけどそれは
コードをたくさん読み書きする時に、どういうところがどう対応するのかを読み取るガイドになる
だけです。
喩えをいくら読んだってコードを読み書きせずに「プログラミング言語における多態性」の概念がわかるなんてことはありえない
という立場です。
ただし読むコードは本当のコードでなければならない、とまでは思ってません。
https://teratail.com/questions/132605#reply-201124 がそうですが、そこは例だったり、擬似コードだったり、偽のプログラミング言語だったりしてもいいんじゃないかとは思います。
(「例」と「喩え」は違うものなので混同しないでね)
投稿2018/07/03 00:32
編集2018/07/10 03:04総合スコア11277
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/05 04:57
2018/07/05 15:57
2018/07/06 16:47
2018/07/10 17:00 編集
2018/07/11 02:41

0
インターフェースはJavaの言語仕様に過ぎません。
また、極論すれば、そんなに重要な機能ではありません。インターフェースなんかなくても多態性は実現できます。
まず、pythonで多態性の例を見てみます。
python
1>>> a = [1,2,3] # list 2>>> b = (1,2,3) # tuple 3>>> c = {1,2,3} # set 4>>> d = {1:"a", 2:"b", 3:"c"} # dict 5>>> print(len(a), len(b), len(c), len(d)) 63 3 3 3
※len()
は組み込み関数ですが、内部ではobj.__len__()
メソッドを呼び出してその値を返しています。つまりこれは多態性を利用した例です。
__len__()
を実装した自作オブジェクトを作ってみます。
python
1>>> class Hoge: 2... def __len__(self): 3... return 42 4... 5>>> h = Hoge() 6>>> print(len(h)) 742
このように機能します。どんなオブジェクトでも、__len__()
さえ実装すればlen()
関数で長さというかサイズを取得できるようになります。いいですね。
というのが、多態性の機能です。ここまではインターフェースは一切関係ない話です。
ご存知かどうか知りませんが、pythonにインターフェースはありません。
**「本当はlen()
を使いたかったが、うっかり__len__()
を実装するのを忘れてしまった」**という状況を想定した、Fuga
クラスを作ります。
python
1>>> class Fuga: 2... pass 3... 4>>> f = Fuga() 5>>> len(f) 6Traceback (most recent call last): 7 File "<stdin>", line 1, in <module> 8TypeError: object of type 'Fuga' has no len()
ご覧の通り、実行時エラーになります。
こういう場合、プログラムを書く立場からすると、できれば、実行時エラーではなくコンパイルエラーになってくれた方が嬉しいのです。
実行するのにン十時間かかるプログラムの、一番最後の行で実行時エラーになったら? ン十時間回して始めて気づくことになるかもしれません。時間の無駄です。
あるシステムの、一年に数回しか呼ばれない処理に実行時エラーになるバグが潜んでいたら? 稼働して何ヶ月も経って発覚することになるでしょう。大変ですね。
コンパイルのときに気づければ、開発リソースを節約でき、バグが減らせます。
この「コンパイルのときに気づけるようにする」ためにJavaにはインターフェースがあります。あけすけに言えば、インターフェースを使うならインターフェースと整合があるように実装しないとコンパイルエラーが出るようにするのが目的です。
インターフェースは多態性を実現する手段ではなく、
「安全に(=バグが入りづらいように)多態性を実装するために、ルールを強制する(=ルール違反はコンパイルエラーにする)手段」
と理解すべきものです。
投稿2018/07/10 14:11
総合スコア30939
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
swordoneさんが、回答に7/12に追記されている、いろいろな楽器奏者の例えがイメージしやすいと思います!
インターフェースは、「演奏して!」とそれぞれの奏者にお願いをする方法のことをさしていて。
多態性は、同じ「演奏して!」というお願いを聞いても、奏者によって演奏の仕方が違うという、奏者の行動自身のことをさしている、
という違いですかね?
投稿2018/07/12 08:18
総合スコア715
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
既に優れた回答がいっぱいあるので、かえって惑わしてしまうと申し訳ないのですが、
「多態性」と「インタフェース」についての定義は既に出ている回答どおりで問題ないと思います。
多態性は概念でそれを実現するためのひとつの手段がインタフェース
気になったのはmr2307さんの最初の質問のなかで多態性の図のところに**「統一してそれをベースに作成」と書いてある部分です。おそらくこれは「継承」**をイメージして書かれたものではないでしょうか?
そうすると、mr2307さんが不明だった部分は「インタフェース」と「継承」の違いになりますのでこれを踏まえた説明をします。たぶんこの観点での回答はなかったかと思いますが違っていたら無視してください。
インタフェース は、MIDI規格になります。 Velocityを調整するとかVolumeを調整するなどという機能をもつことが規格として求められているもので規格書として定義するようなものですね。
具体的な実装はMIDI規格に沿って各メーカーが独自に実装するものになります。
継承 は、たとえるなら汎用のMIDIチップ(実際にあるかどうかわかりませんが)のようなものになります。これはMIDIの規格に準拠した実装をもつ汎用チップになります。
この場合各メーカーはこの汎用チップを自身のMIDI機器に搭載することになるためMIDIの基本的な実装をする必要はありません。他社との差別化をするためにはこのMIDIチップの実装に加え独自の実装を加えたりすることになります。
投稿2018/07/12 00:03
総合スコア2404
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
なんだかややこしいですね。比喩が比喩を呼ぶ展開で。
mr0237さんの7月8日の絵を逆さにしたswordoneさんの図で説明できると思います。
mr0237さんのswordoneさんの図の違いは、絵の矢印が逆に向いていること。
mr0237さんにはそこに着目してもらいたいです。
YAMAHA, KAWAI, KORGがスピーカー、インターフェイスがケーブル、MIDIが音源として、
「MIDI音源をスピーカーで聞く」ってことをするイメージしてみてください。
MIDIプレイヤーとスピーカーをケーブルでつないで、MIDI音源を再生して聞く。と。
スピーカーのケーブルって端子に違いがありますよね。モノラル(黒1口)とかステレオ(赤白2口)とか。ケーブルの形状にあったスピーカーやプレイヤーを用意しないといけない。一方で端子が合えば使える。これがインターフェイスってやつです。mr0237さんの言うルールの強制です。
次に、スピーカーってメーカーや機種によって音って違いますよね。YAMAHAなら〇〇な音。KORGなら△△な音とか。同じMIDI音源、同じMIDIプレーヤー、同じケーブルを使ってもスピーカーが違うと出てくる音は特徴をもって出てくる。これが多態性ってやつです。
「MIDI音源をスピーカーで聞く」ということに対してのインターフェイスや多態性はこんなところです。
ただ、プログラミングになるともっと応用できる範囲が広がるので、「概念」なんて話になります。
回答者諸兄が同じようなことを言っているので、同じことを聞いている感じになると思います。
当然ながら私も回答者諸兄もmr0237さんのような時期がありました。みんなそれぞれのプログラミング言語での実装体験を通してその意味を理解しています。逆に言うと、多態性やインターフェイスの本質を図示して説明することができないのです。応用できる範囲が広く、本質的には超シンプルなので。
自転車に乗るような類の技術です。自転車に乗れるのはバランスが取れたからなんだけど、なんで自転車に乗れるようになったのかを理屈では説明しきれない。一所懸命に説明しても、説明聞いて乗れるわけでもない。そんな技術。
投稿2018/07/11 15:38
総合スコア804
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/07/13 16:56
2018/07/15 23:45
2018/07/16 14:05
2018/07/17 08:55 編集
2018/07/17 18:32

0
こんにちは。
「多態性」と「インターフェース」はどこが違うのでしょうか?
sampa_janeiさんの「果物」と「りんご」の例えは秀逸と思います。
mr0237さん。
「果物」と「りんご」には明らかに相違があると思いませんか?
「ばなな」も「果物」ですね。しかし「りんご」と「ばなな」は別物です。ならば「りんご」と「果物」にも何か相違がある筈ですよね?
『「果物」と「りんご」はどこが違うのでしょうか?』という問いに、mr0237さんさんなりに答えてみて見ませんか?
その答えの「果物」のところに「多態性」、「りんご」のところに「インターフェース」を入れると、『「多態性」と「インターフェース」はどこが違うのでしょうか?』という問いへの答えにほぼなりますよ。
投稿2018/07/07 07:43
総合スコア23274
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。