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

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

ただいまの
回答率

90.50%

  • Java

    13811questions

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

  • オブジェクト指向

    284questions

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

  • インターフェース

    26questions

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

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

受付中

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 912

mr0237

score 143

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

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

イメージ説明

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

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

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

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

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

イメージ説明

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

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

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


8月1日追記

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

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

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

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

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • quiqui

    2018/08/01 11:49

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

    キャンセル

  • swordone

    2018/08/01 12:04 編集

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

    キャンセル

  • mitsu-wan

    2018/08/11 11:19

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

    キャンセル

回答 4

+5

最初に

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

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

コード例

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

interface 楽器 {
    void play(int 音階);
}

class ピアノ implements 楽器 {
    public void play(int 音階) {
        音階に対応する鍵盤を押す;
    }
}

class ギター implements 楽器 {
    public void play(int 音階){
        弦を押さえて弾く;
    }
}

class リコーダー implements 楽器 {
    public void play(int 音階) {
        穴を押さえて吹く;
    }
}

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

class program{
    public static void main(String[] args){
        string input = "piano"; //自分の鳴らしたい楽器を入力
        楽器 instrument = 楽器取得(input);

        //楽器が取得できたら
        if(instrument != null){
            instrument.play(); //取得した楽器を鳴らす(今回はピアノ)
        }
    }

    //nameを入れて、楽器インタフェースを継承した各楽器クラスのインスタンスを返すメソッド
    public 楽器 楽器取得(string name){
        if(name = "piano"){
            return new ピアノ();
        }
        if(name = "guitar"){
            return new ギター();
        }
        if(name = "recorder"){
            return new リコーダー();
        }
        return null;
    }
}

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

最後に

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+4

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/26 01:08

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

    キャンセル

  • 2018/07/26 08:16

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

    キャンセル

+4

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

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

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

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

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


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

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


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

に対して。

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

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

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

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

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

    逆に、mr0237さんの図の矢印の向きは何を意図しているものなのですか?
   この矢印の向きは、「上から下へ」と分かりやすいように書いただけです。

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/26 10:46

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

    キャンセル

  • 2018/07/26 11:34

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

    キャンセル

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

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    xcodeでの画面サイズ変更方法

    swiftでサンプルコードを写しているのですが、参考書を今まで放置してたのでxcodeのバージョンが違うので画面サイズ変更の方法がわからないです。 simulatorでの表示画面

  • 解決済

    Blender Game Engineでマテリアルを透過したい

    Blenderでゲーム開発をしようとしているものです。 Blender Renderで透過処理したマテリアルをBlender Gameに反映させたいと思っているのですが、透過でき

  • 解決済

    tableview row(cell)

    コード import UIKit class ViewController: UIViewController, UITableViewDelegate, UITableView

  • 解決済

    ACCESS クエリでの一部重複?の除外方法について

    前提・実現したいこと こんにちは、質問タイトルが適格でないかもしれませんが宜しくお願いいたします。 通販事業をしており、商品の仕入から販売までのデータベースをACCESSの

  • 受付中

    この場合キャッシュが効くのか

    キャッシュが効いているのかわかりません headerにCache-Control=no-cacheを指定しているがETagやLast-Modifiedを指定しない場合、

  • 解決済

    GAS(google apps script)で一つのスプレッドシート内にある複数のスクリプトの挙動...

    GASに詳しい方、教えていただけますと助かります。 表題の件、一つのスプレッドシートに対してスクリプトが複数あってそれぞれに同じトリガーを設定している場合、そのトリガーが入っ

  • 受付中

    ER図について

    つぶやきアプリを作っているのですが、 ER図を作るとする例えばどんなものがありますか?? サンプル程度でいいので教えていただきたいです

  • 解決済

    pycharmのpython console部分の色の変更

    プログラムには関係ないんですが・・・ 長時間PCの画面を見てると目が疲れてしまうので、色を変えてみようと思って 色を変更してみたのですが、python consoleの部分の色

同じタグがついた質問を見る

  • Java

    13811questions

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

  • オブジェクト指向

    284questions

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

  • インターフェース

    26questions

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

  • トップ
  • Javaに関する質問
  • 多態性(インターフェース)の矢印の向きが逆(上向き)なのは「クラスが汎化していく方向」を表している?