質問編集履歴

5

ソースにコメント追記

2017/08/24 12:41

投稿

Hiiragi3
Hiiragi3

スコア6

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

コード改善

2017/08/24 12:41

投稿

Hiiragi3
Hiiragi3

スコア6

test CHANGED
File without changes
test CHANGED
@@ -28,41 +28,45 @@
28
28
 
29
29
 
30
30
 
31
- public class TestClassAlgorythmMain : MonoBehaviour {
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 instance2 = new ClassC();
43
+ ClassA instance = new ClassC();
44
44
 
45
45
 
46
46
 
47
47
  // (疑問)アップキャストされた変数を、明示的にではなく、動的にダウンキャストしたい
48
48
 
49
- // 且つ、ClassB という文字列をこれ以上記述しない方法を模索したい。
49
+ // ClassB, ClassC という文字列をこれ以上記述しない方法を模索したい。
50
50
 
51
51
 
52
52
 
53
53
  // 失敗例
54
54
 
55
- // Hoge((ClassB)instance1); // 明示的なので、今回の要件には不適切
55
+ // Hoge((ClassB)instance); // 明示的なので、今回の要件には不適切
56
56
 
57
- // Hoge(instance1 as ClassB); // 同上
57
+ // Hoge(instance as ClassB); // 同上
58
-
59
- // Hoge((dynamic)instance1); // Unity2017.1.0p4 で .NET4.6 を使えるようにすれば動く
60
58
 
61
59
 
62
60
 
63
- Hoge(instance1);
61
+ // 条件付き成功例
64
62
 
63
+ // Hoge((dynamic)instance); // Unity2017.1.0p4 で .NET4.6 を使えるようにすれば動く
64
+
65
+
66
+
67
+ Hoge(instance); // error
68
+
65
- Moge(instance2);
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

ソースコードの不備部分を修正

2017/08/24 12:17

投稿

Hiiragi3
Hiiragi3

スコア6

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

一部自己解決したため、追記

2017/08/24 11:58

投稿

Hiiragi3
Hiiragi3

スコア6

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

コードのコメントを修正(アップキャスト -> ダウンキャスト / ダウンキャスト -> アップキャスト)

2017/08/24 10:51

投稿

Hiiragi3
Hiiragi3

スコア6

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