forked from mackysoft/Unity-SerializeReferenceExtensions
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathExample_Generics.cs
More file actions
133 lines (107 loc) · 3.46 KB
/
Example_Generics.cs
File metadata and controls
133 lines (107 loc) · 3.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
using System;
using System.Collections.Generic;
using UnityEngine;
public interface IActor { }
public interface IStandardActor : IActor { }
public interface INetworkActor : IActor { }
public interface IContravarianceAction<in T> where T : IActor
{
void DoAction (T actor);
}
public interface ICovarianceAction<out T> where T : IActor
{
T Actor { get; }
}
public interface IActorAction : IContravarianceAction<IActor>, ICovarianceAction<IActor> { }
public interface IStandardActorAction : IContravarianceAction<IStandardActor>, ICovarianceAction<IStandardActor> { }
public interface INetworkActorAction : IContravarianceAction<INetworkActor>, ICovarianceAction<INetworkActor> { }
[Serializable]
public sealed class StandardActorAction : IContravarianceAction<IStandardActor>, ICovarianceAction<IStandardActor>
{
public void DoAction (IStandardActor actor)
{
}
public IStandardActor Actor => null;
}
[Serializable]
public sealed class ActorAction : IContravarianceAction<IActor>, ICovarianceAction<IActor>
{
public void DoAction (IActor actor)
{
}
public IActor Actor => null;
}
[Serializable]
public abstract class BaseAction<T> : IContravarianceAction<T>, ICovarianceAction<T> where T : IActor
{
public void DoAction (T actor)
{
}
public T Actor => default;
}
[Serializable]
public sealed class DerivedAction1 : BaseAction<IActor> { }
[Serializable]
public sealed class DerivedAction2 : BaseAction<INetworkActor> { }
[Serializable]
public sealed class DerivedAction3 : BaseAction<IStandardActor> { }
[Serializable]
public sealed class NetworkActorAction1 : INetworkActorAction
{
public void DoAction (INetworkActor actor)
{
}
public INetworkActor Actor => null;
}
[Serializable]
public sealed class NetworkActorAction2 : IContravarianceAction<INetworkActor>, ICovarianceAction<INetworkActor>
{
public void DoAction (INetworkActor actor)
{
}
public INetworkActor Actor => null;
}
[Serializable]
public sealed class NetworkActorAction3 : IContravarianceAction<IActor>, ICovarianceAction<IActor>
{
public void DoAction (IActor actor)
{
}
public IActor Actor => null;
}
namespace TestExample.Generics
{
public interface IObjectHolder<T>
{
T Value { get; }
}
[Serializable]
public sealed class ObjectHolder<T> : IObjectHolder<T>
{
[SerializeField]
private T value;
public T Value => value;
}
[Serializable]
public sealed class ParticleSystemHolder : IObjectHolder<ParticleSystem>
{
[SerializeField]
private ParticleSystem value;
public ParticleSystem Value => value;
}
}
public class Example_Generics : MonoBehaviour
{
[SerializeReference, SubclassSelector]
public IContravarianceAction<INetworkActor> contravarianceAction = null;
[SerializeReference, SubclassSelector]
public BaseAction<IActor> baseAction = null;
[SerializeReference, SubclassSelector]
public List<IContravarianceAction<INetworkActor>> contravarianceActions = new List<IContravarianceAction<INetworkActor>>();
[SerializeReference, SubclassSelector]
public List<ICovarianceAction<INetworkActor>> covarianceActions = new List<ICovarianceAction<INetworkActor>>();
[SerializeReference, SubclassSelector]
public TestExample.Generics.IObjectHolder<GameObject> gameObjectHolder = null;
[SerializeReference, SubclassSelector]
public TestExample.Generics.IObjectHolder<ParticleSystem> particleSystemHolder = null;
}