【发布时间】:2023-04-01 11:19:01
【问题描述】:
我这里有点问题。我使用的是泛型类,但在从 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>();
}
}
Agent 类是一个简单的泛型类。我怎样才能做出这样的事情,但要真正发挥作用?如何在不知道类型的情况下定义 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);
}
}
}
}
【问题讨论】:
-
您可以通过接口和协变来实现这一点,但只有在
Agent类中以只读方式使用类型时才应该使用它。 -
KeyValuePair不适合用作字典中的键。您可能想改用Tuple<S, A>。 -
哦,谢谢!到目前为止没有使用元组。能否请您解释一下两者之间的区别?
-
Tuple仅表示 n 个单独对象的组合,而KeyValuePair表示专门表示键和值的组合。 -
根据您的更新,我看不出
states或actions将如何被填充,因此Initializare并没有真正做任何事情。
标签: c# class object generics abstract