Я определил следующий интерфейс:
public interface IStateSpace<State, Action>
where State : IState
where Action : IAction<State, Action> // <-- this is the line that bothers me
{
void SetValueAt(State state, Action action);
Action GetValueAt(State state);
}
По сути, интерфейс IStateSpace
должен быть чем-то похожим на шахматную доску, и в каждой позиции шахматной доски у вас есть набор возможных движений. Эти движения здесь называются IAction
с. Я определил этот интерфейс таким образом, чтобы я мог приспособиться к различным реализациям: затем я могу определить конкретные классы, которые реализуют 2D-матрицу, 3D-матрицу, графики и т. Д.
public interface IAction<State, Action> {
IStateSpace<State, Action> StateSpace { get; }
}
IAction
, будет двигаться вверх (то есть, если в (2, 2)
перейти к (2, 1)
), двигаться вниз и т. Д.
Теперь я хочу, чтобы каждое действие имело доступ к StateSpace, чтобы оно могло выполнять некоторую логику проверки. Это правильная реализация? Или это плохой случай круговой зависимости? Если да, как выполнить «то же самое» по-другому?
Спасибо