public abstract class State where T : IStateMachine { public T context; protected void TransitionTo(State nextState) { context.TransitionTo(nextState); } public virtual void OnEnter() { } public virtual void OnExit() { } } public interface IStateMachine where T : IStateMachine { void TransitionTo(State nextState); }