与泛型的循环依赖

时间:2010-05-20 21:34:16

标签: c# generics oop circular-dependency

我定义了以下界面:

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 s。我已经以这种方式定义了这个接口,所以我可以适应不同的实现:然后我可以定义实现2D矩阵,3D矩阵,图形等的具体类。

public interface IAction<State, Action> {
    IStateSpace<State, Action> StateSpace { get; }
}

IAction,将向上移动(即,如果在(2, 2)移至(2, 1)),则向下移动等。 现在,我希望每个动作都可以访问StateSpace,这样它就可以做一些检查逻辑。这个实现是否正确?或者这是一个循环依赖的坏情况?如果是,如何以不同的方式完成“相同”?

由于

1 个答案:

答案 0 :(得分:2)

您指出的循环引用不是问题。要编译代码,您需要修改IAction接口定义:

public interface IAction<State, Action>
    where State : IState
    where Action: IAction<State, Action>
{
    IStateSpace<State, Action> StateSpace { get; }
}

如何循环引用:)通常编译器将使用占位符来处理它们。在泛型类型约束的情况下,这可能甚至不是必需的。一个小注意事项:如果在不在同一个程序集中的类之间定义循环引用,则会出现问题。