Je suis actuellement confronté à un problème très inquiétant:Generics avec des contraintes hiérarchie
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);
}
Comme vous le ici, à la fois IPosition
, IValue
et IState
dépendent les uns des autres. Comment suis-je censé m'en tirer? Je ne peux pas penser à un autre design qui contournera cette dépendance circulaire et décrit toujours exactement ce que je veux faire!
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; }
}
Fondamentalement, j'avoir un espace d'état IStateSpace
qui a des états IState
à l'intérieur. Leur position dans l'espace d'état est donnée par un IPosition
. Chaque état a ensuite une (ou plusieurs) valeurs IValue
. Je simplifie la hiérarchie, car c'est un peu plus complexe que décrit. L'idée d'avoir cette hiérarchie définie avec des génériques est de permettre différentes implémentations des mêmes concepts (un IStateSpace
sera implémenté à la fois comme une matrice comme un graphique, etc.).
Est-ce que je peux m'en tirer avec ça? Comment résolvez-vous généralement ce genre de problèmes? Quels types de modèles sont utilisés dans ces cas?
Merci