私は現在、非常に厄介な問題に直面しています。
interface IStateSpace<Position, Value>
where Position : IPosition // <-- Problem starts here
where Value : IValue // <-- and here as I don't
{ // know how to get away this
// circular dependency!
// Notice how I should be
// defining generics parameters
// here but I can't!
Value GetStateAt(Position position);
void SetStateAt(Position position, State state);
}
ここで説明するようにIPosition
、IValue
とIState
は相互に依存しています。どうすればこれを回避できますか?この循環依存を回避し、それでも私がやりたいことを正確に説明する他のデザインは考えられません。
interface IState<StateSpace, Value>
where StateSpace : IStateSpace //problem
where Value : IValue //problem
{
StateSpace StateSpace { get; };
Value Value { get; set; }
}
interface IPosition
{
}
interface IValue<State>
where State : IState { //here we have the problem again
State State { get; }
}
基本的に、内部に状態がある状態空間IStateSpace
があります。IState
状態空間でのそれらの位置は、によって与えられIPosition
ます。各状態には、1つ(または複数)の値がありますIValue
。説明よりも少し複雑なので、階層を単純化しています。この階層をジェネリックスで定義するという考え方は、同じ概念のさまざまな実装を可能にすることです(IStateSpace
グラフなどのマトリックスとして実装されます)。
これで逃げられますか?この種の問題を一般的にどのように解決しますか?これらの場合、どのようなデザインが使用されますか?
ありがとう