回答編集履歴
5
おそらく最後の追記
answer
CHANGED
@@ -3,6 +3,21 @@
|
|
3
3
|
|
4
4
|
改めて関連質問を見返してみると、あちこちでこれと類似した回答が出ているにも関わらず、同じような質問で右往左往しているようなので、**上記の回答で何が不明なのかをまず説明してください。**この説明に対するリアクションがない限り、同じような回答の繰り返しにならざるを得ません。
|
5
5
|
|
6
|
+
### 7/24追記 7/19質問追記と7/24質問編集依頼欄への質問者コメントを受けて
|
7
|
+
質問者が回答者の回答をほぼ拒絶しているようなので、おそらくこの質問に対する最後の編集になるかと思います。
|
8
|
+
私含め、回答者は以下のことを答えています。
|
9
|
+
- **インタフェースは多態性を表現するいち手段である**
|
10
|
+
- **多態性は概念の話であり、イメージで伝えるのはほぼ不可能**
|
11
|
+
- **たとえ話は初学者には誤解のもと**
|
12
|
+
|
13
|
+
これらのことを伝えているにも関わらず、いまだにイメージやたとえ話にこだわって「これで合ってるの?」と言われても無理です。そもそもそのイメージ(iPhoneの例え)もちゃんと多態性を理解するものになっていますか?
|
14
|
+
イメージで伝えるのが不可能であるのと同様、イメージで理解しているかどうかを解釈するのが無理です。少なくとも「これこれこういう点が多態性」という説明がないと、正しいかどうかの判断はできません。
|
15
|
+
|
16
|
+
結局、私が最初から主張する「**インタフェースは多態性を表現するいち手段である**」で多態性とインタフェースの関係性はほぼ完結しています。「イメージをつかまないと理解できない」というのは逃げか怠けです。全体をつかまないと、と言っていますが、たとえ話は全体像なんかではなく、むしろ細部の話です。
|
17
|
+
だからこそ、**インタフェースは多態性を表現するいち手段である**という文をそのまま理解してほしいのです。理解できないならその理解できないところを教えてくれと言っているのです。それが無いせいで、やはり同じ話の繰り返しになっています。
|
18
|
+
|
19
|
+
質問で「頭があれで」と言っていますが、あなたの問題はそれ以前に**文章をきちんと理解しようとしていない**ことです。この質問の一連のやり取りを見ていると、**理解できないところや興味ないところなどを一切読んでいない**かのような受け答えが多数見られます。回答者が読んでほしいところをまるっと無視されて質問されているようで、空しいばかりです。
|
20
|
+
|
6
21
|
###### 以下、回答時に付けた蛇足
|
7
22
|
多態性は「1つのメソッドが複数のふるまいをする」という機能のことを指します。
|
8
23
|
これを表現するための1つの手法として、インタフェースという仕組みを使っているのです。インタフェースにメソッド名だけを定義し、実装先のクラスで好き好き実装を書くことで、「インタフェースに定義された1つのメソッドが、それを実装するクラスによってさまざまなふるまいをする」という多態性を実現しているのです。
|
@@ -11,12 +26,12 @@
|
|
11
26
|
|
12
27
|
そもそも、多態**性**と言っているのですから、性質のこと、抽象的な概念の話になるのです。これを日常的な例えで言おうとした瞬間、それは抽象論ではなく具体的な何か、すなわちここで言うインタフェースの話になります(ここで言う「具体的な」というのは、多態性を実現するための方法論としての話であり、「インタフェースが中身のない抽象メソッドを持つもの」という話とはまた異なるものであることに注意)。
|
13
28
|
|
14
|
-
### 追記 どうしてもMIDIで説明が欲しいようなので
|
29
|
+
###### 追記 どうしてもMIDIで説明が欲しいようなので
|
15
30
|
(正直MIDIに関してそこまで知識があるわけではないので細かいところは突っ込まないでいただきたい)
|
16
31
|
|
17
32
|

|
18
33
|
|
19
|
-
### 7/12追記
|
34
|
+
###### 7/12追記
|
20
35
|
MIDIだと説明しづらいので、「楽器」で例を出します。楽器の中でも、「ドレミファソラシド」の音階が出せるものに限定して考えます(つまり、ドラムやシンバルなどは除外)。ピアノ、ギター、リコーダーなど様々ありますね。
|
21
36
|
当然、それぞれの楽器で音の出し方は異なります。ピアノだったら「鍵盤を押す」、ギターだったら「弦を押さえて弾く」、リコーダーだったら「穴をふさいで吹く」といった具合に。
|
22
37
|
でも、実際に演奏する場面を想像してください(もちろん、各奏者は音の出し方を熟知しているという前提で)。ピアノの奏者に「この鍵盤を押して」とか、ギターの奏者に「この弦のこの場所を押さえて弾いて」とか、リコーダー奏者に「この穴とこの穴をふさいで吹いて」なんて指示しませんよね?**楽譜**を渡すのではないでしょうか?もっと言えば、**「『ド』の音を出して」**のような指示になるのではないでしょうか?
|
4
これでわからないなら諦める
answer
CHANGED
@@ -14,4 +14,38 @@
|
|
14
14
|
### 追記 どうしてもMIDIで説明が欲しいようなので
|
15
15
|
(正直MIDIに関してそこまで知識があるわけではないので細かいところは突っ込まないでいただきたい)
|
16
16
|
|
17
|
-

|
17
|
+

|
18
|
+
|
19
|
+
### 7/12追記
|
20
|
+
MIDIだと説明しづらいので、「楽器」で例を出します。楽器の中でも、「ドレミファソラシド」の音階が出せるものに限定して考えます(つまり、ドラムやシンバルなどは除外)。ピアノ、ギター、リコーダーなど様々ありますね。
|
21
|
+
当然、それぞれの楽器で音の出し方は異なります。ピアノだったら「鍵盤を押す」、ギターだったら「弦を押さえて弾く」、リコーダーだったら「穴をふさいで吹く」といった具合に。
|
22
|
+
でも、実際に演奏する場面を想像してください(もちろん、各奏者は音の出し方を熟知しているという前提で)。ピアノの奏者に「この鍵盤を押して」とか、ギターの奏者に「この弦のこの場所を押さえて弾いて」とか、リコーダー奏者に「この穴とこの穴をふさいで吹いて」なんて指示しませんよね?**楽譜**を渡すのではないでしょうか?もっと言えば、**「『ド』の音を出して」**のような指示になるのではないでしょうか?
|
23
|
+
「『ド』の音を出して」と指示されれば、それぞれの奏者はそれぞれの楽器に対応した音の出し方で音を出します。**指示は1つですが、楽器ごとにその指示の実行の仕方が異なる。**このような**性質**のことを**多態性**と呼んでいるのです。
|
24
|
+
|
25
|
+
では、こういった関係をJavaのプログラミングで実現しようと考えます。上記のようなことは、**思っただけでは実現できません。**Javaは静的型付けの言語ですから、通常ならばピアノならピアノ、ギターならギターとしてしか扱えず、上記のような「複数の楽器に対して1つの指示で制御する」といった使い方ができません。
|
26
|
+
実現するために使う方法の1つが**インタフェースという仕組み**です。仮想的にコードを組むとしたらこんな感じでしょうか。
|
27
|
+
```java
|
28
|
+
interface 楽器 {
|
29
|
+
void play(int 音階);
|
30
|
+
}
|
31
|
+
|
32
|
+
class ピアノ implements 楽器 {
|
33
|
+
public void play(int 音階) {
|
34
|
+
音階に対応する鍵盤を押す;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
class ギター implements 楽器 {
|
39
|
+
public void play(int 音階){
|
40
|
+
弦を押さえて弾く;
|
41
|
+
}
|
42
|
+
}
|
43
|
+
|
44
|
+
class リコーダー implements 楽器 {
|
45
|
+
public void play(int 音階) {
|
46
|
+
穴を押さえて吹く;
|
47
|
+
}
|
48
|
+
}
|
49
|
+
```
|
50
|
+
|
51
|
+
こうすることでピアノもギターもリコーダーもすべて「楽器」として扱うことができ、「楽器」の型に入れることで(その型に実際はどんな楽器が入っていようとも)**playメソッドという1つの指示で複数の楽器の指示ができるという多態性**を実現できる、というわけです。
|
3
MIDIを使って多態性とインタフェースを説明
answer
CHANGED
@@ -9,4 +9,9 @@
|
|
9
9
|
|
10
10
|
> 日常的な例えで説明してくれるとありがたいです。
|
11
11
|
|
12
|
-
そもそも、多態**性**と言っているのですから、性質のこと、抽象的な概念の話になるのです。これを日常的な例えで言おうとした瞬間、それは抽象論ではなく具体的な何か、すなわちここで言うインタフェースの話になります(ここで言う「具体的な」というのは、多態性を実現するための方法論としての話であり、「インタフェースが中身のない抽象メソッドを持つもの」という話とはまた異なるものであることに注意)。
|
12
|
+
そもそも、多態**性**と言っているのですから、性質のこと、抽象的な概念の話になるのです。これを日常的な例えで言おうとした瞬間、それは抽象論ではなく具体的な何か、すなわちここで言うインタフェースの話になります(ここで言う「具体的な」というのは、多態性を実現するための方法論としての話であり、「インタフェースが中身のない抽象メソッドを持つもの」という話とはまた異なるものであることに注意)。
|
13
|
+
|
14
|
+
### 追記 どうしてもMIDIで説明が欲しいようなので
|
15
|
+
(正直MIDIに関してそこまで知識があるわけではないので細かいところは突っ込まないでいただきたい)
|
16
|
+
|
17
|
+

|
2
同じ回答をされていてなお理解していない質問者に対する要求
answer
CHANGED
@@ -1,6 +1,9 @@
|
|
1
|
-
|
1
|
+
[このyonaさんの回答](https://teratail.com/questions/70665#reply-111588)でも言われていますが、目的と手段を混同しています。
|
2
2
|
**インタフェースは多態性を表現するいち手段である**、というだけの話です。
|
3
3
|
|
4
|
+
改めて関連質問を見返してみると、あちこちでこれと類似した回答が出ているにも関わらず、同じような質問で右往左往しているようなので、**上記の回答で何が不明なのかをまず説明してください。**この説明に対するリアクションがない限り、同じような回答の繰り返しにならざるを得ません。
|
5
|
+
|
6
|
+
###### 以下、回答時に付けた蛇足
|
4
7
|
多態性は「1つのメソッドが複数のふるまいをする」という機能のことを指します。
|
5
8
|
これを表現するための1つの手法として、インタフェースという仕組みを使っているのです。インタフェースにメソッド名だけを定義し、実装先のクラスで好き好き実装を書くことで、「インタフェースに定義された1つのメソッドが、それを実装するクラスによってさまざまなふるまいをする」という多態性を実現しているのです。
|
6
9
|
|
1
具体論に対する注意
answer
CHANGED
@@ -2,4 +2,8 @@
|
|
2
2
|
**インタフェースは多態性を表現するいち手段である**、というだけの話です。
|
3
3
|
|
4
4
|
多態性は「1つのメソッドが複数のふるまいをする」という機能のことを指します。
|
5
|
-
これを表現するための1つの手法として、インタフェースという仕組みを使っているのです。インタフェースにメソッド名だけを定義し、実装先のクラスで好き好き実装を書くことで、「インタフェースに定義された1つのメソッドが、それを実装するクラスによってさまざまなふるまいをする」という多態性を実現しているのです。
|
5
|
+
これを表現するための1つの手法として、インタフェースという仕組みを使っているのです。インタフェースにメソッド名だけを定義し、実装先のクラスで好き好き実装を書くことで、「インタフェースに定義された1つのメソッドが、それを実装するクラスによってさまざまなふるまいをする」という多態性を実現しているのです。
|
6
|
+
|
7
|
+
> 日常的な例えで説明してくれるとありがたいです。
|
8
|
+
|
9
|
+
そもそも、多態**性**と言っているのですから、性質のこと、抽象的な概念の話になるのです。これを日常的な例えで言おうとした瞬間、それは抽象論ではなく具体的な何か、すなわちここで言うインタフェースの話になります(ここで言う「具体的な」というのは、多態性を実現するための方法論としての話であり、「インタフェースが中身のない抽象メソッドを持つもの」という話とはまた異なるものであることに注意)。
|