5

次のインターフェイスを定義しました。

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インターフェースはチェス盤のようなものであるべきで、チェス盤の各位置には一連の可能な動きがあります。ここでのそれらの動きはIActions と呼ばれます。このインターフェイスをこのように定義したので、さまざまな実装に対応できます。その後、2D マトリックス、3D マトリックス、グラフなどを実装する具象クラスを定義できます。

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

IAction、上に移動する (これは、 に(2, 2)移動する場合(2, 1))、下に移動するなどです。ここで、各アクションが StateSpace にアクセスできるようにして、いくつかのチェック ロジックを実行できるようにします。この実装は正しいですか?それとも、これは循環依存の悪いケースですか? はいの場合、別の方法で「同じ」を達成する方法は?

ありがとう

4

1 に答える 1

2

ご指摘の循環参照は問題ありません。IActionただし、コードをコンパイルするには、インターフェイス定義を修正する必要があります。

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

循環参照はどうですか:)通常、コンパイラはプレースホルダーを使用してそれらを処理します。ジェネリック型の制約の場合、これはおそらく必要ありません。1 つの小さな注意: 同じアセンブリにないクラス間で循環参照を定義すると、問題が発生します。

于 2010-05-20T22:15:53.313 に答える