###前提・実現したいこと
こんばんは、毎度お世話になっております。自分のコードをリファクタリング中に疑問に思ったことがあったので質問させてください。
題名の通り、abstract
クラスがフィールド(public static final
でない)を持つのは正しいかが疑問です。
abstract
に関してまだ、こうやって使うんだみたいな感覚がわかってないので、なにとぞご教授よろしくお願いいたします。
###自分が疑問に思っている部分のコード
キャラクターを管理する抽象クラスAbstractCharacter
java
1// import 省略 2abstract public class AbstractCharacter 3{ 4 private int hp; // このようにabstract クラスがフィールドを持ってよいか、疑問に思いました。 5 private int mp; 6 private Image image; 7 8 private Image readImage(URL url){ 9 // 画像読み込み省略 10 return 画像 11 } 12 13 protected void addHp(int hp){ 14 this.hp += hp; 15 } 16 17 protected void addMp(int mp){ 18 this.mp += mp; 19 } 20 21 public AbstractCharacter(int hp, int mp, URL url){ 22 this.hp = hp; 23 this.mp = mp; 24 this.image = this.readImage(url); 25 } 26 27 abstract public void attack(敵); 28 29// その他の処理は省略 30}
AbstractCharacter
を継承したWizard
クラス
java
1// import 省略 2public class Wizard extends AbstractCharacter 3{ 4 public Wizard(){ 5 super(1500, 5000, Wizard.class.getResource("Wizard.png")); 6 } 7 8 @Override 9 public void attack(敵){ 10 敵.addHp(-200); 11 super.addMp(-50); 12 } 13// その他の処理は省略 14}
###フィールドを持たせないように上のコードを直したら
キャラクターを管理する抽象クラスAbstractCharacter
java
1// import 省略 2abstract public class AbstractCharacter 3{ 4 // private int hp; // フィールドもない 5 // private int mp; 6 // private Image image; 7 8 // コンストラクタはない 9 // public AbstractCharacter(int hp, int mp, URL url){} 10 11 abstract public void attack(敵); 12 13// その他の処理(abstract なメソッド)は省略 14}
AbstractCharacter
を継承したWizard
クラス
java
1// import 省略 2public class Wizard extends AbstractCharacter 3{ 4 private int hp; // 代わりに派生クラス側でフィールドを全て記述 5 private int mp; 6 private Image image; 7 8 private Image readImage(URL url){ 9 // 画像読み込み省略 10 return 画像 11 } 12 13 public Wizard(int hp, int mp, URL url){ 14 this.hp = hp; 15 this.mp = mp; 16 this.image = this.readImage(url); 17 } 18 19 @Override 20 public void attack(敵){ 21 敵.hp -= 200; 22 this.hp -= 50; 23 } 24// その他の処理は省略 25}
###なぜ疑問に思ったか
- こういった記述のコードを見たことがないから
- php を教わった先生に、「抽象クラスに実装があってもあまりうれしくない」と言っていたことを思い出したから
回答2件
あなたの回答
tips
プレビュー