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

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

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

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

Q&A

解決済

2回答

3193閲覧

Attackerクラスをどう修正すればいいですか?

syunn

総合スコア78

Java

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

0グッド

2クリップ

投稿2019/05/27 10:41

編集2019/05/27 11:55

前提・実現したいこと

Creatureクラスは正しいです。
Attackerクラスをどう修正すればいいですか?
宜しくお願いします。
ヒントだけでもいいです。

発生している問題・エラーメッセージ

Attacker.java:26: エラー: Attackerはabstractです。インスタンスを生成することはで きません Attacker attack = new Attacker(); ^ Attacker.java:27: エラー: メソッド本体がないか、abstractとして宣言されています public void attack(); ^ Attacker.java:30: エラー: メソッド本体がないか、abstractとして宣言されています void attack(); ^ エラー3個

該当のソースコード

Java

1 2//生物を表すCreatureクラス 3public class Creature { 4 /** 5 * 定数フィールド 6 */ 7 private final String DEFAULT_NAME = "スライム"; 8 private final int DEFAULT_LIFE = 10; 9 10 /** 11 * インスタンスフィールド 12 */ 13 private String name; 14 private int life; 15 16 /** 17 * コンストラクタ 18 */ 19 public Creature() { 20 setName(DEFAULT_NAME); 21 setLife(DEFAULT_LIFE); 22 } 23 /** 24 * コンストラクタ 25 * @param name 名前 26 * @param life 生命値 27 */ 28 public Creature(String name, int life) { 29 setName(name); 30 if( 0 < life ) { 31 setLife(life); 32 } else { 33 setLife(1); 34 } 35 } 36 37//---------- アクセッサー(セッター、ゲッター) 38 39 /** 40 * nameに名前をセットするメソッド 41 * @param name セットする名前の文字列 42 */ 43 public void setName(String inputName) { 44 if( inputName.length() == 0 ) { 45 System.out.println("1文字以上必要です。"); 46 System.out.println("『名無し』にセットします。"); 47 this.name = "名無し"; 48 } else { 49 this.name = inputName; 50 } 51 } 52 /** 53 * nameの値を返すメソッド 54 */ 55 public String getName() { 56 return this.name; 57 } 58 59 /** 60 * lifeに値をセットするメソッド 61 * @param life 生命値としてセットする整数 62 */ 63 public void setLife(int inputLife) { 64 this.life = inputLife; 65 } 66 /** 67 * nameの値を返すメソッド 68 */ 69 public int getLife() { 70 return this.life; 71 } 72 73//---------- メソッド 74 75 /** 76 * ステータスを参照するメソッド 77 */ 78 @Override 79 public String toString(){ 80 return "名前:" + name + "\t生命値:" + life; 81 } 82}

Java

1 2//攻撃的な生命体を表す抽象クラス、Attackerクラスを作成してください。 3//①生命値と名前を設定できるコンストラクタを持つ。(引数なしコンストラクタと引数ありコンストラクタの二つを持つ) 4//②他の生命体を攻撃する抽象メソッド、void attack(引数はAttacker型インスタンス)メソッドを持つ。 5 6abstract class Attacker extends Creature{ 7 8 9 public void Attacker(){ 10 11 } 12 13 public void Creature(String name, int life) { 14 setName(name); 15 if( 0 < life ) { 16 setLife(life); 17 } else { 18 setLife(1); 19 } 20 } 21 22 private String attack; 23 private int life; 24 25 abstract class Creature{ 26 Attacker attack = new Attacker(); 27 public void attack(); 28 29 } 30 void attack(); 31}

試したこと

抽象クラスからはコンストラクタできない。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

修正と言うか、これはもう書き直した方が良いでしょう。
エラーを消すべく苦労した後は見受けられますが、その結果さらにこんがらがった印象があります。

最終的な目的を全部忘れて、一つずつ指示をクリアしていきましょう。
0. Creatureを継承した具象クラスAttackerを作ってください。
0. Attackerに、引数が無い、空のコンストラクタを実装してください。
0. Attackerに、二つ引数を取る、空のコンストラクタを実装してください。ただし引数の型は順に String, int です。
0. Attackerで、抽象メソッドattackを定義してください。返り値の型はvoid、引数の型はAttackerです。このとき、Attackerも抽象クラスに変える必要があります。

必ずワンステップずつ、エラーが出ないように進めていくようにします。
途中で躓いたら適宜参考資料を確認し、しっかり疑問を解消しましょう。

投稿2019/05/27 12:25

LouiS0616

総合スコア35658

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

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

syunn

2019/05/27 12:32

いつもありがとうございます。1から4のステップでやっていきます。終わるまで寝ないつもりです。
syunn

2019/05/27 13:22

これでコンパイルが通りましたが、以下でよろしいですか? abstract class Attacker extends Creature{ Attacker(){ } Attacker(String name,int life) { } abstract void attack(Attacker attack); }
LouiS0616

2019/05/27 13:42 編集

ビンゴです。 あと不足があるとすれば一点だけですね。(私の回答では触れていませんのでご安心を。) > 『生命値と名前を設定できる』コンストラクタを持つ。 Attacker(String, int) で生命値と名前を設定してやらなければなりませんね。 これは単に上位のクラスに任せてしまえば良いでしょう。 Attacker(String name, int life) { super(name, life); // 親クラスのコンストラクタを呼び出す }
guest

0

Java

1//攻撃的な生命体を表す抽象クラス 2public abstract class Attacker extends Creature { 3 4 //フィールド 5 public int attack; //攻撃力 6 7 //引数なしコンストラクタ 8 public Attacker(){ 9 //super(); //自動でsuper()が呼ばれる 10 } 11 12 //引数ありコンストラクタ 13 public Attacker(int attack) { 14 //super(); //自動でsuper()が呼ばれる 15 setAttack(attack); 16 } 17 18 public Attacker(String name, int life, int attack) { 19 20 //スーパークラスのコンストラクタを呼び出す 21 super(name, life); 22 setAttack(attack); 23 } 24 25 //抽象メソッド 26 public abstract void attack(Attacker enemy); //汎用性が高くなる 27 28 //アクセッサー 29 30 //attackのセッター、ゲッター 31 public void setAttack(int attack) { 32 33 this.attack = attack; 34 } 35 36 public int getAttack() { 37 38 return attack; 39 } 40}

投稿2019/05/28 02:59

syunn

総合スコア78

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問