teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

直した場合の例を追加した

2017/08/11 23:48

投稿

chankane
chankane

スコア139

title CHANGED
File without changes
body CHANGED
@@ -3,13 +3,13 @@
3
3
  題名の通り、``abstract`` クラスがフィールド(``public static final`` でない)を持つのは正しいかが疑問です。
4
4
  ``abstract``に関してまだ、こうやって使うんだみたいな感覚がわかってないので、なにとぞご教授よろしくお願いいたします。
5
5
 
6
- ###該当ソースコード
6
+ ###自分が疑問に思っている部分のコード
7
7
  キャラクターを管理する抽象クラス``AbstractCharacter``
8
8
  ```java
9
9
  // import 省略
10
10
  abstract public class AbstractCharacter
11
11
  {
12
- private int hp;
12
+ private int hp; // このようにabstract クラスがフィールドを持ってよいか、疑問に思いました。
13
13
  private int mp;
14
14
  private Image image;
15
15
 
@@ -18,12 +18,23 @@
18
18
  return 画像
19
19
  }
20
20
 
21
+ protected void addHp(int hp){
22
+ this.hp += hp;
23
+ }
24
+
25
+ protected void addMp(int mp){
26
+ this.mp += mp;
27
+ }
28
+
21
29
  public AbstractCharacter(int hp, int mp, URL url){
22
30
  this.hp = hp;
23
31
  this.mp = mp;
24
32
  this.image = this.readImage(url);
25
33
  }
34
+
35
+ abstract public void attack(敵);
36
+
26
- // その他の処理(abstract なメソッド)は省略
37
+ // その他の処理は省略
27
38
  }
28
39
  ```
29
40
  ``AbstractCharacter``を継承した``Wizard``クラス
@@ -34,10 +45,63 @@
34
45
  public Wizard(){
35
46
  super(1500, 5000, Wizard.class.getResource("Wizard.png"));
36
47
  }
48
+
49
+ @Override
50
+ public void attack(敵){
51
+ 敵.addHp(-200);
52
+ super.addMp(-50);
53
+ }
37
54
  // その他の処理は省略
38
55
  }
39
56
  ```
57
+ ###フィールドを持たせないように上のコードを直したら
40
58
 
59
+ キャラクターを管理する抽象クラス``AbstractCharacter``
60
+ ```java
61
+ // import 省略
62
+ abstract public class AbstractCharacter
63
+ {
64
+ // private int hp; // フィールドもない
65
+ // private int mp;
66
+ // private Image image;
67
+
68
+ // コンストラクタはない
69
+ // public AbstractCharacter(int hp, int mp, URL url){}
70
+
71
+ abstract public void attack(敵);
72
+
73
+ // その他の処理(abstract なメソッド)は省略
74
+ }
75
+ ```
76
+ ``AbstractCharacter``を継承した``Wizard``クラス
77
+ ```java
78
+ // import 省略
79
+ public class Wizard extends AbstractCharacter
80
+ {
81
+ private int hp; // 代わりに派生クラス側でフィールドを全て記述
82
+ private int mp;
83
+ private Image image;
84
+
85
+ private Image readImage(URL url){
86
+ // 画像読み込み省略
87
+ return 画像
88
+ }
89
+
90
+ public Wizard(int hp, int mp, URL url){
91
+ this.hp = hp;
92
+ this.mp = mp;
93
+ this.image = this.readImage(url);
94
+ }
95
+
96
+ @Override
97
+ public void attack(敵){
98
+ 敵.hp -= 200;
99
+ this.hp -= 50;
100
+ }
101
+ // その他の処理は省略
102
+ }
103
+ ```
104
+
41
105
  ###なぜ疑問に思ったか
42
106
  1. こういった記述のコードを見たことがないから
43
107
  2. php を教わった先生に、「抽象クラスに実装があってもあまりうれしくない」と言っていたことを思い出したから

2

ミス修正

2017/08/11 23:47

投稿

chankane
chankane

スコア139

title CHANGED
File without changes
body CHANGED
@@ -7,7 +7,7 @@
7
7
  キャラクターを管理する抽象クラス``AbstractCharacter``
8
8
  ```java
9
9
  // import 省略
10
- public class AbstractCharacter
10
+ abstract public class AbstractCharacter
11
11
  {
12
12
  private int hp;
13
13
  private int mp;
@@ -23,7 +23,7 @@
23
23
  this.mp = mp;
24
24
  this.image = this.readImage(url);
25
25
  }
26
- // その他の処理は省略
26
+ // その他の処理(abstract なメソッド)は省略
27
27
  }
28
28
  ```
29
29
  ``AbstractCharacter``を継承した``Wizard``クラス

1

コードのミス

2017/08/11 14:25

投稿

chankane
chankane

スコア139

title CHANGED
File without changes
body CHANGED
@@ -7,7 +7,7 @@
7
7
  キャラクターを管理する抽象クラス``AbstractCharacter``
8
8
  ```java
9
9
  // import 省略
10
- public class AbstractCharacter
10
+ public class AbstractCharacter
11
11
  {
12
12
  private int hp;
13
13
  private int mp;
@@ -29,7 +29,7 @@
29
29
  ``AbstractCharacter``を継承した``Wizard``クラス
30
30
  ```java
31
31
  // import 省略
32
- public class Wizard
32
+ public class Wizard extends AbstractCharacter
33
33
  {
34
34
  public Wizard(){
35
35
  super(1500, 5000, Wizard.class.getResource("Wizard.png"));