【问题标题】:C# Replacing an Object in a class of Objects dynamically ~C#动态替换对象类中的一个对象~
【发布时间】:2013-09-27 02:28:01
【问题描述】:

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

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

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

【问题讨论】:

  • 这里到底有什么问题?
  • 您可能对策略模式感兴趣。 en.wikipedia.org/wiki/Strategy_pattern
  • 简而言之,我正在尝试创建一个方法,该方法将 X 对任何可以使用 X 的 Object 进行 ~
  • 所以你有不同的行为实现,想要一个代理来处理所有不同的行为,对吗?
  • @Ela 差不多,我想用一种方法来处理多种不同类型的对象~我知道怎么做,只是不是 GOOD 方法:P

标签: c# object types casting type-conversion


【解决方案1】:

在我看来,您的 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;

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-09-26
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多