回答編集履歴

4

例の追加

2022/06/12 14:28

投稿

TN8001
TN8001

スコア9326

test CHANGED
@@ -65,6 +65,8 @@
65
65
  hoge4 = "攻撃ステート";
66
66
  //Console.WriteLine(base.hoge1); // 抽象ステート
67
67
  //Console.WriteLine(base.hoge3); // 抽象ステート
68
+ //Console.WriteLine(base.hoge5); // 抽象ステート
69
+ //Console.WriteLine(base.hoge6); // エラー CS0205 抽象基本メンバーを呼び出すことはできません
68
70
  }
69
71
  }
70
72
 

3

違うな

2022/06/12 11:57

投稿

TN8001
TN8001

スコア9326

test CHANGED
@@ -23,10 +23,11 @@
23
23
 
24
24
  > この警告はAttackState.hogeが宣言されたことによって継承元である抽象クラスStateDataClassのhogeをAttasckStateクラス内においては上書きしました、という認識で使っていたのですがこれは間違っていますでしょうか?
25
25
 
26
- 上書きというのが`override`のような意味なら違います。
27
26
  元の`hoge`(`base.hoge`としてアクセスできます)は残ったまま、別の`hoge`を`AttackState`に作っています。
28
27
  意図してやることもありますが、そういう場合は「明示的に隠ぺいしてますよ」ということで`new`と付けます。
29
28
  [new 修飾子 - C# リファレンス | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/new-modifier)
29
+
30
+ ↑の回答コードでは値そのものを上書きしました。
30
31
 
31
32
  > プロパティを試してみたのですが、上手く行きませんでした。
32
33
 

2

通常プロパティ追加

2022/06/12 11:49

投稿

TN8001
TN8001

スコア9326

test CHANGED
@@ -39,9 +39,12 @@
39
39
  {
40
40
  public string hoge1 = "抽象ステート";
41
41
  public string hoge2 = "抽象ステート";
42
+
42
43
  public string hoge3 { get; set; } = "抽象ステート";
44
+ public string hoge4 { get; set; } = "抽象ステート";
45
+
43
- public virtual string hoge4 { get; set; } = "抽象ステート";
46
+ public virtual string hoge5 { get; set; } = "抽象ステート";
44
- public abstract string hoge5 { get; set; }
47
+ public abstract string hoge6 { get; set; }
45
48
  }
46
49
 
47
50
  public class AttackState : StateDataClass
@@ -52,13 +55,15 @@
52
55
  public string hoge3 { get; set; } = "攻撃ステート"; // CS0108
53
56
  //public new string hoge3 { get; set; } = "攻撃ステート"; // CS0108が消える 意味は↑と同じ
54
57
 
55
- public override string hoge4 { get; set; } = "攻撃ステート";
56
58
  public override string hoge5 { get; set; } = "攻撃ステート";
59
+ public override string hoge6 { get; set; } = "攻撃ステート";
57
60
 
58
61
  public AttackState()
59
62
  {
60
63
  hoge2 = "攻撃ステート";
64
+ hoge4 = "攻撃ステート";
61
65
  //Console.WriteLine(base.hoge1); // 抽象ステート
66
+ //Console.WriteLine(base.hoge3); // 抽象ステート
62
67
  }
63
68
  }
64
69
 
@@ -83,6 +88,9 @@
83
88
 
84
89
  Console.WriteLine(attackState.hoge5); // 攻撃ステート
85
90
  Console.WriteLine(currentState.hoge5); // 攻撃ステート
91
+
92
+ Console.WriteLine(attackState.hoge6); // 攻撃ステート
93
+ Console.WriteLine(currentState.hoge6); // 攻撃ステート
86
94
  }
87
95
  }
88
96
  }

1

追記

2022/06/12 11:36

投稿

TN8001
TN8001

スコア9326

test CHANGED
@@ -18,3 +18,72 @@
18
18
  // 以下省略
19
19
  }
20
20
  ```
21
+
22
+ ---
23
+
24
+ > この警告はAttackState.hogeが宣言されたことによって継承元である抽象クラスStateDataClassのhogeをAttasckStateクラス内においては上書きしました、という認識で使っていたのですがこれは間違っていますでしょうか?
25
+
26
+ 上書きというのが`override`のような意味なら違います。
27
+ 元の`hoge`(`base.hoge`としてアクセスできます)は残ったまま、別の`hoge`を`AttackState`に作っています。
28
+ 意図してやることもありますが、そういう場合は「明示的に隠ぺいしてますよ」ということで`new`と付けます。
29
+ [new 修飾子 - C# リファレンス | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/new-modifier)
30
+
31
+ > プロパティを試してみたのですが、上手く行きませんでした。
32
+
33
+ プロパティならメソッドと同じように、`virtual`や`abstract`にできます。
34
+
35
+ ```cs
36
+ namespace Qsg2zhvq2qgsipz
37
+ {
38
+ public abstract class StateDataClass
39
+ {
40
+ public string hoge1 = "抽象ステート";
41
+ public string hoge2 = "抽象ステート";
42
+ public string hoge3 { get; set; } = "抽象ステート";
43
+ public virtual string hoge4 { get; set; } = "抽象ステート";
44
+ public abstract string hoge5 { get; set; }
45
+ }
46
+
47
+ public class AttackState : StateDataClass
48
+ {
49
+ public string hoge1 = "攻撃ステート"; // CS0108
50
+ //public new string hoge1 = "攻撃ステート"; // CS0108が消える 意味は↑と同じ
51
+
52
+ public string hoge3 { get; set; } = "攻撃ステート"; // CS0108
53
+ //public new string hoge3 { get; set; } = "攻撃ステート"; // CS0108が消える 意味は↑と同じ
54
+
55
+ public override string hoge4 { get; set; } = "攻撃ステート";
56
+ public override string hoge5 { get; set; } = "攻撃ステート";
57
+
58
+ public AttackState()
59
+ {
60
+ hoge2 = "攻撃ステート";
61
+ //Console.WriteLine(base.hoge1); // 抽象ステート
62
+ }
63
+ }
64
+
65
+ class Program
66
+ {
67
+ static void Main()
68
+ {
69
+ AttackState attackState = new AttackState();
70
+ StateDataClass currentState = attackState;
71
+
72
+ Console.WriteLine(attackState.hoge1); // 攻撃ステート
73
+ Console.WriteLine(currentState.hoge1); // 抽象ステート
74
+
75
+ Console.WriteLine(attackState.hoge2); // 攻撃ステート
76
+ Console.WriteLine(currentState.hoge2); // 攻撃ステート
77
+
78
+ Console.WriteLine(attackState.hoge3); // 攻撃ステート
79
+ Console.WriteLine(currentState.hoge3); // 抽象ステート
80
+
81
+ Console.WriteLine(attackState.hoge4); // 攻撃ステート
82
+ Console.WriteLine(currentState.hoge4); // 攻撃ステート
83
+
84
+ Console.WriteLine(attackState.hoge5); // 攻撃ステート
85
+ Console.WriteLine(currentState.hoge5); // 攻撃ステート
86
+ }
87
+ }
88
+ }
89
+ ```