diff --git a/Assets/Example/Example_Contravariance.cs b/Assets/Example/Example_Contravariance.cs deleted file mode 100644 index c264ed5..0000000 --- a/Assets/Example/Example_Contravariance.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; -using UnityEngine; - -public interface IActor { } -public interface IStandardActor : IActor { } -public interface INetworkActor : IActor { } -public interface IAction where T : IActor { } - -public interface IActorAction : IAction { } -public interface IStandardActorAction : IAction { } -public interface INetworkActorAction : IAction { } - -[Serializable] -public sealed class NetworkActorAction : INetworkActorAction { } - -public class Example_Contravariance : MonoBehaviour -{ - - [SerializeReference, SubclassSelector] - public List> actions = new List>(); - -} diff --git a/Assets/Example/Example_Generics.cs b/Assets/Example/Example_Generics.cs new file mode 100644 index 0000000..bc4f604 --- /dev/null +++ b/Assets/Example/Example_Generics.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +public interface IActor { } +public interface IStandardActor : IActor { } +public interface INetworkActor : IActor { } + +public interface IContravarianceAction where T : IActor { + void DoAction (T actor); +} + +public interface ICovarianceAction where T : IActor +{ + T Actor { get; } +} + +public interface IActorAction : IContravarianceAction, ICovarianceAction { } +public interface IStandardActorAction : IContravarianceAction, ICovarianceAction { } +public interface INetworkActorAction : IContravarianceAction, ICovarianceAction { } + +[Serializable] +public sealed class StandardActorAction : IContravarianceAction, ICovarianceAction +{ + public void DoAction (IStandardActor actor) + { + } + public IStandardActor Actor => null; +} + +[Serializable] +public sealed class ActorAction : IContravarianceAction, ICovarianceAction +{ + public void DoAction (IActor actor) + { + } + public IActor Actor => null; +} + +[Serializable] +public abstract class BaseAction : IContravarianceAction, ICovarianceAction where T : IActor +{ + public void DoAction (T actor) { + } + public T Actor => default; +} + +[Serializable] +public sealed class DerivedAction1 : BaseAction { } + +[Serializable] +public sealed class DerivedAction2 : BaseAction { } + +[Serializable] +public sealed class DerivedAction3 : BaseAction { } + +[Serializable] +public sealed class NetworkActorAction1 : INetworkActorAction +{ + public void DoAction (INetworkActor actor) + { + } + public INetworkActor Actor => null; +} + +[Serializable] +public sealed class NetworkActorAction2 : IContravarianceAction, ICovarianceAction +{ + public void DoAction (INetworkActor actor) + { + } + public INetworkActor Actor => null; +} + +[Serializable] +public sealed class NetworkActorAction3 : IContravarianceAction, ICovarianceAction +{ + public void DoAction (IActor actor) + { + } + public IActor Actor => null; +} + +public class Example_Generics : MonoBehaviour +{ + + [SerializeReference, SubclassSelector] + public List> contravarianceActions = new List>(); + + [SerializeReference, SubclassSelector] + public List> covarianceActions = new List>(); + +} diff --git a/Assets/Example/Example_Contravariance.cs.meta b/Assets/Example/Example_Generics.cs.meta similarity index 100% rename from Assets/Example/Example_Contravariance.cs.meta rename to Assets/Example/Example_Generics.cs.meta