質問編集履歴

1

サンプルコードと質問内容を詳細にしました

2015/07/02 14:59

投稿

nkkn1446
nkkn1446

スコア10

test CHANGED
File without changes
test CHANGED
@@ -6,11 +6,15 @@
6
6
 
7
7
  // クラス定義
8
8
 
9
- public class Base<T> where T : new() {
9
+ public class Base<T> : MonoBehaviour where T : Base<T> {
10
10
 
11
- public T func() {
11
+ public static T CreateInstance() {
12
12
 
13
+ GameObject obj = new GameObject();
14
+
15
+ T component = obj.AddComponent<T>(); // Tクラスの実体を生成する
16
+
13
- return new T();
17
+ return component;
14
18
 
15
19
  }
16
20
 
@@ -32,20 +36,34 @@
32
36
 
33
37
  }
34
38
 
39
+ ```
35
40
 
41
+ MonoBehaviourというUnityのクラスを継承するとnew()ができなくなるため、別途実体を生成するためのメソッドを定義する必要があります。
42
+
43
+
44
+
45
+ そのメソッドを派生クラスから呼び出した際に型を指定せずに済むようジェネリッククラスを使用しているのですが、下記のような指定をするとエラーになってしまいます。
46
+
47
+
48
+
49
+ ```lang-C#
36
50
 
37
51
  // Base<T>を型指定してListに格納する
38
52
 
39
- List<Base<T>> bases = new List<Base<T>> {new A(), new B()};
53
+ List<Base<T>> bases = new List<Base<T>> {
54
+
55
+ A.CreateInstance(),
56
+
57
+ B.CreateInstance()
58
+
59
+ };
60
+
61
+ // ジェネリックメソッドのwhereにBase<T>を指定する
62
+
63
+ void func<Type>() where Type : Base<T> {
64
+
65
+ }
40
66
 
41
67
  ```
42
68
 
43
- 上記のようにListにジェネリッククラスとして定義した基底クラスを指定することでその派生クラスを管理したいのですが、以下のようなエラーが出てしまいます。(おそらく、Unity独自のエラー表示だと思います)
44
-
45
-
46
-
47
- __error CS0246: The type or namespace name `T' could not be found. Are you missing a using directive or an assembly reference?__
48
-
49
-
50
-
51
- 何か解決方法はないか。あるいは、別の手段はないかご教授いただけますと幸いです。よろしくお願いします。
69
+ 特別ジェネリッククラスを使わければけなわけでないので他に解決する方法がないかご教授いただけと幸いです。