2010-05-20 41 views
3

我已經定義如下界面:泛型環形依賴性

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矩陣,三維矩陣,圖表等

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

IAction一個具體的類,將向上移動(此是,如果在(2, 2)移動到(2, 1)),向下移動等 現在,我會希望每個動作都可以訪問一個狀態空間,因此它可以做一些檢查邏輯。這個實現是否正確?或者這是一個循環依賴的壞例子?如果是,如何以不同的方式完成「相同」?

謝謝

+2

你剛剛讓我的大腦爆炸了一點。 – Aren 2010-05-20 21:35:49

+0

你可以添加IAction 的定義嗎? – brickner 2010-05-20 21:45:55

+0

hm,它在那裏,第二塊代碼。 – 2010-05-20 21:56:32

回答

2

您指出的循環引用不是問題。爲了您的代碼編譯,您將需要修改,雖然你IAction接口定義:

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

是如何形成的圓形參考:)一般來說,編譯器將使用佔位符處理它們。在通用類型約束的情況下,這可能甚至不是必需的。一個小提示:如果您在不在同一個程序集中的類之間定義循環引用,那將會成爲問題。

+0

啊。那麼真正的循環依賴是什麼?如果我認識你並且這是一個循環參考,那麼他們不是一個問題嗎? ty – 2010-05-20 22:25:42

+1

循環依賴問題涉及程序集。這是你需要在不同程序集中的兩個類之間進行循環引用。據說這是可能的一些技巧,但它通常可以以更清潔的方式解決。 – Thorarin 2010-05-20 22:31:15