gpt4 book ai didi

c# - 具有约束层次结构的泛型

转载 作者:太空宇宙 更新时间:2023-11-03 18:18:17 25 4
gpt4 key购买 nike

我目前面临一个非常令人不安的问题:

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 , IValueIState互相依赖。我该怎么办?我想不出任何其他设计可以绕过这种循环依赖,并且仍然准确地描述了我想要做的事情!
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 给出.然后每个状态都有一个(或多个)值 IValue .我正在简化层次结构,因为它比描述的要复杂一些。使用泛型定义此层次结构的想法是允许相同概念的不同实现( IStateSpace 将被实现为矩阵和图等)。

我能逃脱惩罚吗?您一般如何解决此类问题?在这些情况下使用哪种设计?

谢谢

最佳答案

我看不到您要实现的目标-为什么要通过使用泛型将具体类型强制到您的接口(interface)中?这似乎完全违背了接口(interface)的意图——不使用具体类型。以下非通用定义有什么问题?

public interface IStateSpace
{
IState GetStateAt(IPosition position);
void SetStateAt(IPosition position, IState state);
}

public interface IState
{
IStateSpace StateSpace { get; }
IValue Value { get; set; }
}

public interface IPosition
{
}

public interface IValue
{
IState State { get; }
}

然后你可以创建具体的实现。
internal class MatrixStateSpace : IStateSpace
{
IState GetStateAt(IPosition position)
{
return this.Matrix[position];
}

void SetStateAt(IPosition position, IState state)
{
this.Matrix[position] = state;
}
}

internal class GraphStateSpace : IStateSpace
{
IState GetStateAt(IPosition position)
{
return this.Graph.Find(position).State;
}

void SetStateAt(IPosition position, IState state)
{
this.Graph.Find(position).State = state;
}
}

现在您可以决定使用 MatrixStateSpaceGraphStateSpace IStateSpace 的实例实例是必需的。当然,所有其他类型也是如此。

实现中具有挑战性的部分是您必须创建新实例。例如,可能有一个方法 IState AddNewState()定义于 IStateSpace . IStateSpace 的任何具体实现面临创建 IState 的问题实例(理想情况下)不知道任何具体类型实现 IState .这是工厂、依赖注入(inject)和相关概念开始发挥作用的地方。

关于c# - 具有约束层次结构的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2886527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com