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>(); }