未来エンジニア養成所Blog

月単価180万以上のプログラミング講師がプログラミングを皆に楽しんでもらうための情報をお届けします。

【Java】オブジェクト指向の基本問題2-15

title


問題2-15

ミュージシャンを表現するMusician抽象クラスは完成しています。
(変更は禁止です)

また、歌唱可能を表現するSingableインタフェースと、演奏可能を表現するPlayableインタフェースも完成しています。
(変更は禁止です)

あるバンドを構成するためにボーカリストVocalistクラス、ギタリストGuitaristクラス、コーラス&ドラマーChorusDrummerクラスを作成してください。


【Voclalistクラス】

  1. Musician抽象クラスを継承し、Singableインタフェースを実装します。

  2. 名前(String型)を受け取るコンストラクタを定義します。
    適切に値を保持してください。

  3. 歌うsingメソッドを実装してください。
    「○○は熱唱しました!」と出力してください。


【Guitaristクラス】

  1. Musician抽象クラスを継承し、Playableインタフェースを実装します。

  2. ギターの種類を表すguitarTypeインスタンスフィールド(String型)を持ちます。

  3. 第一引数に名前(String型)、第二引数にギターの種類(Stting型)を受け取るコンストラクタを定義します。
    適切に値を保持してください。

  4. 演奏playメソッドを実装してください。
    「○○は△△を演奏しました!」と出力してください。


【ChrusDrummerクラス】

  1. Musician抽象クラスを継承し、SingableインタフェースとPlayableインタフェースを実装します。

  2. 名前(String型)を受け取るコンストラクタを定義します。
    適切に値を保持してください。

  3. 歌うsingメソッドを実装してください。
    「○○はコーラスでハモりました!」と出力してください。

  4. 演奏playメソッドを実装してください。
    「○○はドラムを演奏しました!」と出力してください。


また、InheritanceInterfacePracticeクラスのmainメソッドは一部未完成です。
「ミュージックスタート!」以下を次のように実装してください。

  1. forループで順にみていきます。
  2. 歌うことが可能であれば歌います。
  3. 演奏が可能であれば演奏します。


【実行結果】

桜井は熱唱しました!
田原はリードギターを演奏しました!
中川はベースを演奏しました!
鈴木はコーラスでハモりました!
鈴木はドラムを演奏しました!


【InheritanceInterfacePractice.java】

public class InheritanceInterfacePractice {
    public static void main(String[] args) {

        // ミュージシャン配列の作成
        Musician[] band = {
                    new Vocalist("桜井"),
                    new Guitarist("田原", "リードギター"),
                    new Guitarist("中川", "ベース"),
                    new ChorusDrummer("鈴木")
        };


        // ミュージックスタート!


    }
}


// ミュージシャン抽象クラス
abstract class Musician {

    // 名前フィールド
    private String name;

    // コンストラクタ
    public Musician(String name) {
        this.name = name;
    }

    // 名前取得メソッド
    public String getName() {
        return name;
    }

}


// 歌唱可能インタフェース
interface Singable {
    void sing();
}


// 演奏可能インタフェース
interface Playable {
    void play();
}


// ここにボーカリストクラスを作成してください


// ここにギタリストクラスを作成してください


// ここにコーラス&ドラマークラスを作成してください


解答例

【InheritanceInterfacePractice.java】

public class InheritanceInterfacePractice {
    public static void main(String[] args) {

        // ミュージシャン配列の作成
        Musician[] band = {
                    new Vocalist("桜井"),
                    new Guitarist("田原", "リードギター"),
                    new Guitarist("中川", "ベース"),
                    new ChorusDrummer("鈴木")
        };

        // ミュージックスタート!
        for(int i = 0; i < band.length; i++) {

            // 歌うこと可能であれば歌う
            if(band[i] instanceof Singable) {
                ((Singable)band[i]).sing();
            }

            // 演奏可能であれば演奏する
            if(band[i] instanceof Playable) {
                ((Playable)band[i]).play();
            }
        }

    }
}

// ミュージシャン抽象クラス
abstract class Musician {

    // 名前フィールド
    private String name;

    // コンストラクタ
    public Musician(String name) {
        this.name = name;
    }

    // 名前取得メソッド
    public String getName() {
        return name;
    }

}

// 歌唱可能インタフェース
interface Singable {
    void sing();
}

// 演奏可能インタフェース
interface Playable {
    void play();
}

// ボーカリストクラス
class Vocalist extends Musician implements Singable {

    // コンストラクタ
    public Vocalist(String name) {
        super(name);
    }

    // 歌うメソッドの実装
    public void sing() {
        System.out.println(getName() + "は熱唱しました!");
    }
}

// ギタリストクラス
class Guitarist extends Musician implements Playable {

    // ギタータイプ名
    private String guitarType;

    // コンストラクタ
    public Guitarist(String name, String guitarType) {
        super(name);
        this.guitarType = guitarType;
    }

    // 演奏メソッドの実装
    public void play() {
        System.out.println(getName() + "は" + guitarType + "を演奏しました!");
    }
}

// コーラス&ドラマークラス
class ChorusDrummer extends Musician implements Singable, Playable {

    // コンストラクタ
    public ChorusDrummer(String name) {
        super(name);
    }

    // 歌うメソッドの実装
    public void sing() {
        System.out.println(getName() + "はコーラスでハモりました!");
    }

    // 演奏メソッドの実装
    public void play() {
        System.out.println(getName() + "はドラムを演奏しました!");
    }
}


解説

今回の問題は、クラスの継承とインタフェースの実装を組み合わせた内容になっています。

クラスはクラスの継承と、インタフェースの実装を同時に行うことが可能です。


class サブクラス extends スーパークラス
                 implements インタフェース1, インタフェース2, ・・・ {
    ....
}


ただし、先にスーパークラスの継承を記述し、次にインタフェースの実装を記述してください。

逆だとコンパイルできません。



あと、インタフェースの抽象メソッドは自動的に「public abstract」となります。

publicな抽象メソッドを実装するには必ずpublicなメソッドにしなければいけません。


参考図書



LINE公式アカウント

仕事が辛くてたまらない人生が、仕事が楽しくてたまらない人生に変わります。
【登録いただいた人全員に、無料キャリア相談プレゼント中!】


LineOfficial

友だち追加