我需要一些 C# 泛型说明
I need some C# generics clarification
我这边有点问题。我使用的是通用 class 但在从 UI 面板中选择之前我不知道类型。在知道对象的类型之前如何声明对象?
所以这是示例
public class UI
{
Agent myAgent;
public UI()
{
}
public void Initialize()
{
if (textBox1.Text == "LabAgent")
myAgent = new Agent<LabState, LabAction>();
else
myAgent = new Agent<FieldState, FieldAction>();
}
}
代理 class 是一个简单的通用 class。我怎样才能做出这样的东西,但要真正起作用?如何在不知道类型的情况下定义 myAgent?
注意:我使用的是 C#,而不是 Java。
编辑 1:
public class Agent<S,A>
where S : AState
where A : AAction
{
private List<S> states;
private List<A> actions;
private Dictionary<KeyValuePair<S, A>, float> Q;
private S stareCurenta;
public void Initializare()
{
foreach (S s in states)
{
foreach (A a in actions)
{
Q.Add(new KeyValuePair<S, A>(s, a), 32000);
}
}
}
}
How to define the myAgent without knowing the type?
你不能。 Agent<LabState, LabAction>
和 Agent<FieldAgent, FieldAction>
是完全不同的类型。如果您尝试在另一种方法中使用 myAgent
,您如何在编译时知道它是 Agent<LabState, LabAction>
还是 Agent<FieldAgent, FieldAction>
,因此编译器如何绑定到任何属性或方法?
您 可以 有一个非泛型 Agent
基础 class,但它无法访问任何泛型属性或方法。
您似乎想使用协方差。为了首先做到这一点,您需要一个 Agent
可以实现的接口,我们称它为 IAgent
。然后你需要像
这样定义那个接口
public interface IAgent<out TState, out TAction>
where TState : IState
where TAction : IAction
那你可以
IAgent<IState, IAction> agent = new Agent<LabState, LabAction>
假设您的 Agent
、LabState
和 LabAction
分别实现了 IAgent
、IState
和 IAction
。但是如果它只有 return 这些类型的值并且从不接受它们,那么你只会将 IAgent
定义为协变。所以泛型类型应该只显示为 return 类型的方法和只读属性的类型。您也可以用基数 类 代替接口 IAction
和 IState
,但协方差运算符 out
仅适用于接口。
你不知道。
我认为你最好制作两个 UI classes,每种类型的代理一个,它们都来自相同的基础 class,它提供了所有 UI 非代理功能。
我这边有点问题。我使用的是通用 class 但在从 UI 面板中选择之前我不知道类型。在知道对象的类型之前如何声明对象? 所以这是示例
public class UI
{
Agent myAgent;
public UI()
{
}
public void Initialize()
{
if (textBox1.Text == "LabAgent")
myAgent = new Agent<LabState, LabAction>();
else
myAgent = new Agent<FieldState, FieldAction>();
}
}
代理 class 是一个简单的通用 class。我怎样才能做出这样的东西,但要真正起作用?如何在不知道类型的情况下定义 myAgent? 注意:我使用的是 C#,而不是 Java。 编辑 1:
public class Agent<S,A>
where S : AState
where A : AAction
{
private List<S> states;
private List<A> actions;
private Dictionary<KeyValuePair<S, A>, float> Q;
private S stareCurenta;
public void Initializare()
{
foreach (S s in states)
{
foreach (A a in actions)
{
Q.Add(new KeyValuePair<S, A>(s, a), 32000);
}
}
}
}
How to define the myAgent without knowing the type?
你不能。 Agent<LabState, LabAction>
和 Agent<FieldAgent, FieldAction>
是完全不同的类型。如果您尝试在另一种方法中使用 myAgent
,您如何在编译时知道它是 Agent<LabState, LabAction>
还是 Agent<FieldAgent, FieldAction>
,因此编译器如何绑定到任何属性或方法?
您 可以 有一个非泛型 Agent
基础 class,但它无法访问任何泛型属性或方法。
您似乎想使用协方差。为了首先做到这一点,您需要一个 Agent
可以实现的接口,我们称它为 IAgent
。然后你需要像
public interface IAgent<out TState, out TAction>
where TState : IState
where TAction : IAction
那你可以
IAgent<IState, IAction> agent = new Agent<LabState, LabAction>
假设您的 Agent
、LabState
和 LabAction
分别实现了 IAgent
、IState
和 IAction
。但是如果它只有 return 这些类型的值并且从不接受它们,那么你只会将 IAgent
定义为协变。所以泛型类型应该只显示为 return 类型的方法和只读属性的类型。您也可以用基数 类 代替接口 IAction
和 IState
,但协方差运算符 out
仅适用于接口。
你不知道。
我认为你最好制作两个 UI classes,每种类型的代理一个,它们都来自相同的基础 class,它提供了所有 UI 非代理功能。