回答編集履歴
4
例の追加
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
違うな
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
通常プロパティ追加
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 hoge
|
46
|
+
public virtual string hoge5 { get; set; } = "抽象ステート";
|
44
|
-
public abstract string hoge
|
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
追記
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
|
+
```
|