質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

4回答

3171閲覧

多態性(インターフェース)の矢印の向きが逆(上向き)なのは「クラスが汎化していく方向」を表している?

mr0237

総合スコア164

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

1クリップ

投稿2018/07/25 15:43

編集2018/07/31 16:57

こちらの質問に掲載されていた

多態性(及びインターフェース)の図↓

イメージ説明

これらの図を見ると・・・

「1対n」つまり「1対多」の関係になっておりますが、
この**「1対多」の向きが、**

・下が「多」
・上が「1」

逆(上向き)になっていますが、これは**「継承」のこと(is-aの原則)を指している**のでしょうか?

つまり、階層で例えると、

イメージ説明

上層部には、共通部分を見出してそれを別に作る→「汎化」
下層部には、ある目的のために詳細に作成した→「特化」

多態性 (及びインターフェース)の「1対多」の向きは、「クラスが汎化していく方向」を表しているのでしょうか?

説明が下手で失礼しますが、回答のほうお願いいたします。


8月1日追記

前回の質問「インターフェース」と「多態性」では「統一化する」点では同じだが、イメージ的には「手段」と「概念」の違いであるということ?」のコメントにおいて、

逆に、mr0237さんの図の矢印の向きは何を意図しているものなのですか?

この矢印の向きは、「上から下へ」と分かりやすいように書いただけです。

というコメントをしましたが、
これはつまり、「1対n=1対多の関係」になっていれば、図の向きは逆でも良いということなんでしょうか?(矢印の向きだけではありません。)

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2018/07/26 01:47

これ私の図なのに、なぜ他人に聞こうと思ったのか
quickquip

2018/07/26 07:30

「これらの図を見ると・・・」の部分は、「この図を見ると・・・」の誤りですか?
quickquip

2018/07/26 07:36 編集

『・下が「多」 ・上が「1」』 の部分は単純な記述ミスですか? それとも、『・下が「多」 ・上が「1」 』を正順とした時に『この図は逆になっている』という主張ですか?
mr0237

2018/07/29 14:31

>『・下が「多」 ・上が「1」 』を正順とした時に『この図は逆になっている』という主張ですか? そういうことです。下が「多」・上が「1」を正しい順としたときに「この図は逆になっている」ということです。
swordone

2018/07/31 18:30

どうも話を聞いていると、「継承を使った特化・汎化の関係」と、「UMLのクラス図の1対多の関係」とかをごちゃまぜにしている疑惑が…
quickquip

2018/08/01 02:49

2枚目の図の左側の赤い矢印は要りませんよね? 右側の青い矢印と表現が重複してる。
swordone

2018/08/01 03:05 編集

> これはつまり、「1対n=1対多の関係」になっていれば、図の向きは逆でも良いということなんでしょうか? 何が「つまり」なんだか、さっぱりわからん。
mitsu-wan

2018/08/11 02:19

理解が曖昧なまま、無理矢理図的に理解しようとして余計混乱してませんか?
guest

回答4

0

####最初に
他の回答者様方にとって的外れの回答に見えるかは分かりませんが、
mr0237様はまずコードを書かれてはいかがですか?

「多態性」と「インターフェース」は、どちらもプログラミングにおける性質や機能でしかなく、
またプログラミングもプログラムを作成する上での手段にしかなりえないと思います。

####コード例
swordone様のコードを誠に勝手ながら引用させて頂きますが、以下のクラスがあります。

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}

呼び出し側は以下のように使ったりします。

java

1class program{ 2 public static void main(String[] args){ 3 string input = "piano"; //自分の鳴らしたい楽器を入力 4 楽器 instrument = 楽器取得(input); 5 6 //楽器が取得できたら 7 if(instrument != null){ 8 instrument.play(); //取得した楽器を鳴らす(今回はピアノ) 9 } 10 } 11 12 //nameを入れて、楽器インタフェースを継承した各楽器クラスのインスタンスを返すメソッド 13 public 楽器 楽器取得(string name){ 14 if(name = "piano"){ 15 return new ピアノ(); 16 } 17 if(name = "guitar"){ 18 return new ギター(); 19 } 20 if(name = "recorder"){ 21 return new リコーダー(); 22 } 23 return null; 24 } 25}

「interface」と「多態性」をコードにしたときの使い方は大体こんな感じです。

####最後に
あとは自分が作ろうと考えているシステムを実際に作る上で、インタフェースや多態性を使う必要があると感じたときに使えばよいと思うのですが、
それでは駄目ですか??

まずはコードを書いて感覚を掴むと良いと思います。否、そうするべきです。

「interface」と「多態性」の違いという概念から理解しようとしても、
やはりいずれはコードを書かなければ私たちの問答は不毛になってしまいますから。

投稿2018/08/07 01:52

編集2018/08/07 04:55
BluOxy

総合スコア2663

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

私の図は既出の通り、あくまで「入力の流れ」を示しているに過ぎず、図の上下の位置関係についてはたいして意味はありません。あなたがもともとYAMAHAなどを上に書いていたため、その図の位置関係を崩さず書こうとしてそうなりました。

ピラミッド型の図で表しているのはその通りの事柄なのですが、その図の記法と私の図の記法は全く関係ありません。

そもそもこの図は前回の質問「「インターフェース」と「多態性」では「統一化する」点では同じだが、イメージ的には「手段」と「概念」の違いであるということ?」において、言葉を尽くしても全く理解しようとしない質問者に対して、例に挙げていたMIDIを使って、

  • 「多態性」が性質であること
  • 「インタフェース」は多態性を表現するための手段であること

を(かなり大雑把ですが)説明した図であり、クラスの特化・汎化の話とは一切関係のない図です。勝手に拡大解釈しないでください。

投稿2018/07/29 15:01

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

般化・特化というのは継承に使う用語です。
オブジェクトがインターフェースを持つのは継承ではなく実装と言います。

あなたの場合、まずは絵本を見るのを卒業して本を読むのが近道です。

投稿2018/07/25 16:03

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2018/07/25 16:08

この人の場合、そもそも文章を読まないので無意味かと。 あるいは、「読む」という行為を「文字を見る」ということと勘違いしているか。
Zuishin

2018/07/25 23:16

読んで欲しいですね。絵に描けるものと描けないものがありますから。
guest

0

「継承」のこと(is-aの原則)を指しているのでしょうか?

そんなわけはない。そうなら、「MIDI is 単一の入力」「KAWAI(の機器) is MIDI」が成り立ってないといけないけど、別にそんなことはない。
したがって継承関係ではない。

継承関係を表現するのであれば、上位下位という用語がある以上、上位を図の上に置くのが自然。しかし、この図は継承関係をあらわしているわけではないので、上に何を持ってきた方が自然なのか? という議論には正解や慣習があるわけじゃない。

矢印はここでは「データの流れ」を表している、つまり「入力」から「出力」へと向きを与えていると考えるのが妥当。


多態性 (及びインターフェース)の「1対多」の向きは、「クラスが汎化していく方向」を表しているのでしょうか?

違う。
多態性の図は「多態性を説明するため」に書いた図なのだから、「クラスの継承関係」を表現しない。


これはつまり、「1対n=1対多の関係」になっていれば、図の向きは逆でも良いということなんでしょうか?

に対して。

「1対n=1対多の関係」になっていれば

「関係が1対多でなければならない」「関係が1対多である必要がある」みたいなことを、誰かが言っていたのか? どこからこんな話が出てきたのか困惑している状態。

図の向きは逆でも良いということなんでしょうか?

図の向きに正解があるということはない。図の「よい」「わるい」は、「図で説明したいこと」が「図が表現していること」と合っているかという尺度で判断するもの。

この図が「これらのものごとが汎化/特価の関係にあります」ということを伝えたくて書いたものなら、上位概念を上に、下位概念を下に配置するのが「よい」。
「上位概念が下にある状態」は「わるい」図。「説明したいこと」と「表現」が食い違っている状態だから。

逆に、mr0237さんの図の矢印の向きは何を意図しているものなのですか?

この矢印の向きは、「上から下へ」と分かりやすいように書いただけです。

この質問は「何を表現しているんですか?」と聞いているだけで、「よい」「わるい」の話はしていない。

伝えたいことが「ちゃんと伝わる」ようにする、表現したいことが「ちゃんと表現できている」状態にするのが図の目的。形や、場所や、配置や、矢印はおおむね「何かを表現している」。
それを聞いているだけ。

投稿2018/07/25 22:09

編集2018/08/01 04:55
quickquip

総合スコア11038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2018/07/26 01:46

元の図を尊重しすぎてKAWAIなどを上のままにした私のミスですねこれは
quickquip

2018/07/26 02:34

インタフェースを上に、実装を下に置いた方がよかったってことでしょうか。そうなら別にミスというほどのことではないと思いますけど。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問