2

我想这是我关于同一主题的第二篇文章,有点……

无论如何,我想通过传递一个 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();
    }
}

可悲的是,我很清楚这是一种非常糟糕的实现方式,是否有更好的方法来动态处理对象?

4

2 回答 2

3

在我看来,您的ExampleBehavior类应该扩展一些基本类型(它是抽象类还是接口取决于您的情况)。我们称之为基本类型BehaviorBase。然后你的AIBundle类应该有一个类型BehaviorBase为的属性Behavior,你可以做这样的事情,而不需要任何类型的转换:

public void UpdateBehavior(BehaviorBase behavior) {
   this.agent.AIbundles.Behavior = behavior;
}

你会这样称呼它:

var agent = ...;
var someAIThing = initWithAgent(agent);
BehaviorBase behavior = ...;
someAIThing.UpdateBehavior(behavior);

在这一点上,我会强烈考虑消除该UpdateBehavior方法并直接将行为分配给属性:

var agent = ...;
var someAIThing = initWithAgent(agent);
BehaviorBase behavior = ...;
agent.AIBundles.Behavior = behavior;
于 2013-09-21T22:10:59.490 回答
0

也许您不应该在“集合”之类的类中创建每种类型的属性。如果您想按名称检索正确的行为,请改用字典。或者只是行为列表。如果需要,每个行为都可以具有名称或类型属性之类的东西来识别它。您也可以只拥有一个 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;
        }
     }
于 2013-09-21T22:20:52.133 回答