質問編集履歴
5
ソースにコメント追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -44,7 +44,9 @@
|
|
44
44
|
|
45
45
|
|
46
46
|
|
47
|
-
// (疑問)アップキャストされた変数を、明示的にではなく、動的にダウンキャストしたい
|
47
|
+
// (疑問)アップキャストされた変数を、明示的にではなく、何かしらの手法で動的にダウンキャストした上でメソッドに渡したい
|
48
|
+
|
49
|
+
// 或いは、メソッドに渡った段階で暗黙的にダウンキャストされた状態にしたい
|
48
50
|
|
49
51
|
// ClassB, ClassC という文字列をこれ以上記述しない方法を模索したい。
|
50
52
|
|
@@ -71,6 +73,8 @@
|
|
71
73
|
}
|
72
74
|
|
73
75
|
|
76
|
+
|
77
|
+
// 下記の Hoge() と Moge() は変更しない
|
74
78
|
|
75
79
|
void Hoge(ClassB instance)
|
76
80
|
|
4
コード改善
test
CHANGED
File without changes
|
test
CHANGED
@@ -28,41 +28,45 @@
|
|
28
28
|
|
29
29
|
|
30
30
|
|
31
|
-
public class TestClassAlgor
|
31
|
+
public class TestClassAlgorithmMain : MonoBehaviour
|
32
|
+
|
33
|
+
{
|
32
34
|
|
33
35
|
|
34
36
|
|
35
|
-
void Start
|
37
|
+
void Start()
|
36
38
|
|
37
39
|
{
|
38
40
|
|
39
41
|
// アップキャスト
|
40
42
|
|
41
|
-
ClassA instance1 = new ClassB();
|
42
|
-
|
43
|
-
ClassA instance
|
43
|
+
ClassA instance = new ClassC();
|
44
44
|
|
45
45
|
|
46
46
|
|
47
47
|
// (疑問)アップキャストされた変数を、明示的にではなく、動的にダウンキャストしたい
|
48
48
|
|
49
|
-
//
|
49
|
+
// ClassB, ClassC という文字列をこれ以上記述しない方法を模索したい。
|
50
50
|
|
51
51
|
|
52
52
|
|
53
53
|
// 失敗例
|
54
54
|
|
55
|
-
// Hoge((ClassB)instance
|
55
|
+
// Hoge((ClassB)instance); // 明示的なので、今回の要件には不適切
|
56
56
|
|
57
|
-
// Hoge(instance
|
57
|
+
// Hoge(instance as ClassB); // 同上
|
58
|
-
|
59
|
-
// Hoge((dynamic)instance1); // Unity2017.1.0p4 で .NET4.6 を使えるようにすれば動く
|
60
58
|
|
61
59
|
|
62
60
|
|
63
|
-
|
61
|
+
// 条件付き成功例
|
64
62
|
|
63
|
+
// Hoge((dynamic)instance); // Unity2017.1.0p4 で .NET4.6 を使えるようにすれば動く
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
Hoge(instance); // error
|
68
|
+
|
65
|
-
Moge(instance
|
69
|
+
Moge(instance); // error
|
66
70
|
|
67
71
|
}
|
68
72
|
|
@@ -92,7 +96,7 @@
|
|
92
96
|
|
93
97
|
|
94
98
|
|
95
|
-
public class ClassA : Object {}
|
99
|
+
public class ClassA : Object { }
|
96
100
|
|
97
101
|
|
98
102
|
|
3
ソースコードの不備部分を修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,7 +1,3 @@
|
|
1
|
-
(すみません、コードのコメント間違えてました・・・)
|
2
|
-
|
3
|
-
|
4
|
-
|
5
1
|
###前提・実現したいこと
|
6
2
|
|
7
3
|
Unity 2017.1.0p4 で .NET4.6 を設定すれば利用可能になる dynamic キーワードど同等なことが、Unity 5.5.0f3 周辺の環境でも実現できるようになりたい。
|
@@ -15,6 +11,122 @@
|
|
15
11
|
|
16
12
|
|
17
13
|
(追記:dynamic を使えるようにする手法はやはり問題がありそうなので候補から外します)
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
###該当のソースコード
|
20
|
+
|
21
|
+
(情報が足らない部分があったので追記しました)
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
```C#
|
26
|
+
|
27
|
+
using UnityEngine;
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
public class TestClassAlgorythmMain : MonoBehaviour {
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
void Start ()
|
36
|
+
|
37
|
+
{
|
38
|
+
|
39
|
+
// アップキャスト
|
40
|
+
|
41
|
+
ClassA instance1 = new ClassB();
|
42
|
+
|
43
|
+
ClassA instance2 = new ClassC();
|
44
|
+
|
45
|
+
|
46
|
+
|
47
|
+
// (疑問)アップキャストされた変数を、明示的にではなく、動的にダウンキャストしたい
|
48
|
+
|
49
|
+
// 且つ、ClassB という文字列をこれ以上記述しない方法を模索したい。
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
// 失敗例
|
54
|
+
|
55
|
+
// Hoge((ClassB)instance1); // 明示的なので、今回の要件には不適切
|
56
|
+
|
57
|
+
// Hoge(instance1 as ClassB); // 同上
|
58
|
+
|
59
|
+
// Hoge((dynamic)instance1); // Unity2017.1.0p4 で .NET4.6 を使えるようにすれば動く
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
Hoge(instance1);
|
64
|
+
|
65
|
+
Moge(instance2);
|
66
|
+
|
67
|
+
}
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
void Hoge(ClassB instance)
|
72
|
+
|
73
|
+
{
|
74
|
+
|
75
|
+
instance.Hoge();
|
76
|
+
|
77
|
+
}
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
void Moge(ClassC instance)
|
82
|
+
|
83
|
+
{
|
84
|
+
|
85
|
+
instance.Moge();
|
86
|
+
|
87
|
+
}
|
88
|
+
|
89
|
+
}
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
public class ClassA : Object {}
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
public class ClassB : ClassA
|
100
|
+
|
101
|
+
{
|
102
|
+
|
103
|
+
public void Hoge()
|
104
|
+
|
105
|
+
{
|
106
|
+
|
107
|
+
Debug.Log("hogehogehoge");
|
108
|
+
|
109
|
+
}
|
110
|
+
|
111
|
+
}
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
public class ClassC : ClassB
|
116
|
+
|
117
|
+
{
|
118
|
+
|
119
|
+
public void Moge()
|
120
|
+
|
121
|
+
{
|
122
|
+
|
123
|
+
Debug.Log("mogemogemoge");
|
124
|
+
|
125
|
+
}
|
126
|
+
|
127
|
+
}
|
128
|
+
|
129
|
+
```
|
18
130
|
|
19
131
|
|
20
132
|
|
@@ -42,76 +154,6 @@
|
|
42
154
|
|
43
155
|
|
44
156
|
|
45
|
-
###該当のソースコード
|
46
|
-
|
47
|
-
```C#
|
48
|
-
|
49
|
-
using UnityEngine;
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
public class TestClassAlgorythmMain : MonoBehaviour {
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
void Start ()
|
58
|
-
|
59
|
-
{
|
60
|
-
|
61
|
-
// アップキャスト
|
62
|
-
|
63
|
-
ClassA instance = new ClassB();
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
// (疑問)アップキャストされた変数を、明示的にではなく、動的にダウンキャストしたい
|
68
|
-
|
69
|
-
// Hoge((ClassB)instance); // 明示的なので、今回の要件には不適切
|
70
|
-
|
71
|
-
// Hoge((dynamic)instance); // Unity2017.1.0p4 で .NET4.6 を使えるようにすれば動く
|
72
|
-
|
73
|
-
Hoge(instance); // error
|
74
|
-
|
75
|
-
}
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
void Hoge(ClassB instance)
|
80
|
-
|
81
|
-
{
|
82
|
-
|
83
|
-
instance.Hoge();
|
84
|
-
|
85
|
-
}
|
86
|
-
|
87
|
-
}
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
public class ClassA : Object {}
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
public class ClassB : ClassA
|
98
|
-
|
99
|
-
{
|
100
|
-
|
101
|
-
public void Hoge()
|
102
|
-
|
103
|
-
{
|
104
|
-
|
105
|
-
Debug.Log("hogehogehoge");
|
106
|
-
|
107
|
-
}
|
108
|
-
|
109
|
-
}
|
110
|
-
|
111
|
-
```
|
112
|
-
|
113
|
-
|
114
|
-
|
115
157
|
###試したこと
|
116
158
|
|
117
159
|
リフレクション関連を使えば何か出来るかと思ったが、そもそも C# 初心者レベルなので作法が良く分からなかった。
|
2
一部自己解決したため、追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -11,6 +11,10 @@
|
|
11
11
|
下記エラーの対応によって dynamic が使えるようになればそれでも良いですし、それ以外の方法があれば知りたいです。
|
12
12
|
|
13
13
|
(まぁ正直、用意されている内部構造を変えれるとしても当然推奨はされないとは思いますが・・・)
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
(追記:dynamic を使えるようにする手法はやはり問題がありそうなので候補から外します)
|
14
18
|
|
15
19
|
|
16
20
|
|
1
コードのコメントを修正(アップキャスト -> ダウンキャスト / ダウンキャスト -> アップキャスト)
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
(すみません、コードのコメント間違えてました・・・)
|
2
|
+
|
3
|
+
|
4
|
+
|
1
5
|
###前提・実現したいこと
|
2
6
|
|
3
7
|
Unity 2017.1.0p4 で .NET4.6 を設定すれば利用可能になる dynamic キーワードど同等なことが、Unity 5.5.0f3 周辺の環境でも実現できるようになりたい。
|
@@ -50,13 +54,13 @@
|
|
50
54
|
|
51
55
|
{
|
52
56
|
|
53
|
-
//
|
57
|
+
// アップキャスト
|
54
58
|
|
55
59
|
ClassA instance = new ClassB();
|
56
60
|
|
57
61
|
|
58
62
|
|
59
|
-
// (疑問)
|
63
|
+
// (疑問)アップキャストされた変数を、明示的にではなく、動的にダウンキャストしたい
|
60
64
|
|
61
65
|
// Hoge((ClassB)instance); // 明示的なので、今回の要件には不適切
|
62
66
|
|