問題2-15
ミュージシャンを表現するMusician抽象クラスは完成しています。
(変更は禁止です)
また、歌唱可能を表現するSingableインタフェースと、演奏可能を表現するPlayableインタフェースも完成しています。
(変更は禁止です)
あるバンドを構成するためにボーカリストVocalistクラス、ギタリストGuitaristクラス、コーラス&ドラマーChorusDrummerクラスを作成してください。
【Voclalistクラス】
Musician抽象クラスを継承し、Singableインタフェースを実装します。
名前(String型)を受け取るコンストラクタを定義します。
適切に値を保持してください。歌うsingメソッドを実装してください。
「○○は熱唱しました!」と出力してください。
【Guitaristクラス】
Musician抽象クラスを継承し、Playableインタフェースを実装します。
ギターの種類を表すguitarTypeインスタンスフィールド(String型)を持ちます。
第一引数に名前(String型)、第二引数にギターの種類(Stting型)を受け取るコンストラクタを定義します。
適切に値を保持してください。演奏playメソッドを実装してください。
「○○は△△を演奏しました!」と出力してください。
【ChrusDrummerクラス】
Musician抽象クラスを継承し、SingableインタフェースとPlayableインタフェースを実装します。
名前(String型)を受け取るコンストラクタを定義します。
適切に値を保持してください。歌うsingメソッドを実装してください。
「○○はコーラスでハモりました!」と出力してください。演奏playメソッドを実装してください。
「○○はドラムを演奏しました!」と出力してください。
また、InheritanceInterfacePracticeクラスのmainメソッドは一部未完成です。
「ミュージックスタート!」以下を次のように実装してください。
- forループで順にみていきます。
- 歌うことが可能であれば歌います。
- 演奏が可能であれば演奏します。
【実行結果】
桜井は熱唱しました! 田原はリードギターを演奏しました! 中川はベースを演奏しました! 鈴木はコーラスでハモりました! 鈴木はドラムを演奏しました!
【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公式アカウント
仕事が辛くてたまらない人生が、仕事が楽しくてたまらない人生に変わります。
【登録いただいた人全員に、無料キャリア相談プレゼント中!】