質問編集履歴
1
サンプルコードと質問内容を詳細にしました
test
CHANGED
File without changes
|
test
CHANGED
@@ -6,11 +6,15 @@
|
|
6
6
|
|
7
7
|
// クラス定義
|
8
8
|
|
9
|
-
public class Base<T> where T :
|
9
|
+
public class Base<T> : MonoBehaviour where T : Base<T> {
|
10
10
|
|
11
|
-
public T
|
11
|
+
public static T CreateInstance() {
|
12
12
|
|
13
|
+
GameObject obj = new GameObject();
|
14
|
+
|
15
|
+
T component = obj.AddComponent<T>(); // Tクラスの実体を生成する
|
16
|
+
|
13
|
-
return ne
|
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>> {
|
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
|
+
特別ジェネリッククラスを使わなければいけないわけではないので、他に解決する方法がないかご教授いただけると幸いです。
|