Update generics example
This commit is contained in:
parent
7ae59bfab7
commit
105f461ba8
@ -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<in T> where T : IActor { }
|
|
||||||
|
|
||||||
public interface IActorAction : IAction<IActor> { }
|
|
||||||
public interface IStandardActorAction : IAction<IStandardActor> { }
|
|
||||||
public interface INetworkActorAction : IAction<INetworkActor> { }
|
|
||||||
|
|
||||||
[Serializable]
|
|
||||||
public sealed class NetworkActorAction : INetworkActorAction { }
|
|
||||||
|
|
||||||
public class Example_Contravariance : MonoBehaviour
|
|
||||||
{
|
|
||||||
|
|
||||||
[SerializeReference, SubclassSelector]
|
|
||||||
public List<IAction<INetworkActor>> actions = new List<IAction<INetworkActor>>();
|
|
||||||
|
|
||||||
}
|
|
||||||
93
Assets/Example/Example_Generics.cs
Normal file
93
Assets/Example/Example_Generics.cs
Normal file
@ -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<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;
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Example_Generics : MonoBehaviour
|
||||||
|
{
|
||||||
|
|
||||||
|
[SerializeReference, SubclassSelector]
|
||||||
|
public List<IContravarianceAction<INetworkActor>> contravarianceActions = new List<IContravarianceAction<INetworkActor>>();
|
||||||
|
|
||||||
|
[SerializeReference, SubclassSelector]
|
||||||
|
public List<ICovarianceAction<INetworkActor>> covarianceActions = new List<ICovarianceAction<INetworkActor>>();
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user