我想这是我对同一主题的第二篇文章,有点......
无论如何,我想通过传递AI行为来动态更新我的代理 AIbundles 类来替换或添加:
* 不工作代码
public class agent
{
AIbundles = new AIbundle();
public void UpdateBehavior (object Behavior)
{
object CastedBehavior = (Behavior.type) Behavior; //Cast
this.agent.AIbundles.(Behavior.type) = CastedBehavior;
}
}
我的AIbundles类示例(极简化)
public class AIbundles
{
ExampleBehavior1 ExampleBehavior1;
ExampleBehavior2 ExampleBehavior2;
ExampleBehavior3 ExampleBehavior3;
AIbundles()
{
ExampleBehavior1 = new ExampleBehavior1();
ExampleBehavior2 = new ExampleBehavior2();
ExampleBehavior3 = new ExampleBehavior3();
}
}
可悲的是,我很清楚这是实现这一点的一种非常糟糕的方式,是否有更好的动态处理对象的方法?
答案 0 :(得分:3)
在我看来,你的ExampleBehavior
类应该扩展一些基类型(无论是抽象类还是接口都取决于你的情况)。我们调用基类型BehaviorBase
。然后,您的AIBundle
类应该有一个名为BehaviorBase
的{{1}}类型的属性,您可以执行类似的操作,而不需要任何类型的转换:
Behavior
你会这样称呼:
public void UpdateBehavior(BehaviorBase behavior) {
this.agent.AIbundles.Behavior = behavior;
}
此时,我强烈考虑删除var agent = ...;
var someAIThing = initWithAgent(agent);
BehaviorBase behavior = ...;
someAIThing.UpdateBehavior(behavior);
方法,并直接将行为直接分配给属性:
UpdateBehavior
答案 1 :(得分:0)
也许你不应该在类“集合”中创建每种类型的属性。 如果要按名称检索正确的行为,请使用Dictionary。 或者只是一个行为列表。 如果需要,每个行为都可以具有类似名称或类型属性的标识。 您也可以拥有一个IBehavior接口,该接口具有常见的方法......
这样的事情可能会为你做到这一点我想:
public class AIbundles
{
public Dictionary<string, IExampleBehavior> ExampleBehaviors { get; set; }
public AIbundles()
{
this.ExampleBehaviors = new Dictionary<string, IExampleBehavior>();
}
}
public class agent {
AIbundles bundles = new AIbundles();
public void UpdateBehavior (IExampleBehavior behavior)
{
this.bundles.ExampleBehaviors[behavior.Name] = behavior;
}
}