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

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

ただいまの
回答率

90.48%

  • Java

    16124questions

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

java デザインパターンの実用

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 173

eggpol

score 20

///宣言
interface B{
}

class A implments B{
}

///実行メソッド内
B a =new A();


インターフェースの方に実装したクラスを暗黙型変換するデザインパターンが
あることがSilverの教本にかいてあったのですが実用が思いつかなかったので
これの実際の使用用途を教えて下さい。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • mts10806

    2019/06/13 21:56

    提示のコードにはどこにも「キャスト」がないようですが。
    教本には例示コードはなかったのでしょうか。

    キャンセル

  • eggpol

    2019/06/13 22:03

    そうですね
    逆でした。キャストではなく暗黙型変換でした。
    直しておきます。

    キャンセル

回答 2

+2

この例からだと範囲が広すぎてどう言えば良いのか困りますが、世の中でインターフェイス使っているコードのほぼほぼ全部実用事例だと思って差し支えないんじゃないでしょうか。

「java インターフェイス メリット」あたりでググると最初の方に出てくると思いますが
【Java】「interface」のメリットと使い所を考えてみた

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/14 12:26

    使いどころを理解できました
    ありがとうございます

    キャンセル

checkベストアンサー

+1

それはデザインパターンだと教科書に書いていましたか?
ただ、インターフェイスを実装しているだけのように見えます。

インターフェイスについての話題は以前にもしたので、過去に書いたサンプルを転記します。

定義

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

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

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

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

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

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

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

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

interface」多態性をコードにしたときの使い方は大体こんな感じです。
instrument.play("ド");のように、楽器という抽象的な概念に対してプログラミングするとポリモーフィズムという性質がそのコードに生まれます。

この性質を利用すれば、今後あなたが楽器を使ってコーディングをする際に楽器を実装した新しい楽器(バイオリンやフルートなど)を追加しても流用ができるようになります。

あとはあなたがそれを必要だと感じられたそのときに使えば良いかと。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/14 12:25 編集

    回答ありがとうございます。
    インターフェースの使い方が非常にわかりやすくありがとうございます。
    私の質問の意図が悪かったのかもしれません。
    例えば
    楽器 g = new ピアノ() ←アップキャスト
    ピアノ p =new ピアノ()
    このようにできるようですが
    このようなアップキャストができる意図を知りたいです。

    キャンセル

  • 2019/06/14 12:59

    >このようなアップキャストができる意図を知りたいです。

    回答文中に書かれてますよ。

    >この性質を利用すれば、今後あなたが楽器を使ってコーディングをする際に楽器を実装した新しい楽器(バイオリンやフルートなど)を追加しても流用ができるようになります。

    キャンセル

  • 2019/06/14 13:05 編集

    もう少し具体例を出すとするなら、DI(Dependency Injection)を意識した実装をするときはポリモーフィズムを利用しますね。wikipediaを見るとコードで解説もされています。
    https://ja.wikipedia.org/wiki/%E4%BE%9D%E5%AD%98%E6%80%A7%E3%81%AE%E6%B3%A8%E5%85%A5

    キャンセル

  • 2019/06/14 14:16

    いわれた箇所を見直しもう一度コードを読みました。

    string input = "piano"; //自分の鳴らしたい楽器を入力
    楽器 instrument = 楽器取得(input);

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

    ↑ここでポリモーフィズムが使われているのですね。
    確かにアップキャストできなければ新たに作成した楽器の分まで処理を書かなければならず手間になりますね。
    納得です

    キャンセル

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

  • Java

    16124questions

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