【问题标题】:pass in object and convert it on the fly传入对象并即时转换它
【发布时间】:2015-10-23 17:16:56
【问题描述】:

我可以访问一个抽象方法,该方法采用一种称为“武器”的类型。

我传入的对象有对父级的引用,但我必须做一个转换。

执行一次似乎没问题,但对于其他方法,我可能需要传递 3、4 甚至 5 个对象,这意味着我最终必须转换所有这些对象才能访问我需要的属性。

有没有办法传入转换而不是包含引用的实际对象?

类似这样的东西,我知道这不会编译:

GetRobotSystems(Weapon r=(MilitaryRobot)r.Baserobot)

这是工作代码:

protected override IEnumerable<WeaponsCollection> GetRobotSystems(Weapon robot)
{
    MilitaryRobot r = (MilitaryRobot)robot.BaseRobot;

    yield return r.Aromor;
    yield return r.Weapons;

}

【问题讨论】:

  • 我不明白你想要完成什么。如果方法需要MilitaryRobot,为什么不相应地更改方法声明?
  • 我感觉问题的根本原因在于您的设计,并为您提供任何具体帮助,您需要发布至少部分类层次结构。

标签: c# c#-4.0 .net-4.0 .net-4.5


【解决方案1】:

我可以访问一个抽象方法,该方法采用一种称为“武器”的类型。

不,您没有抽象方法。它只知道如何处理 MilitaryRobot 类型的对象。

如果所有 Weapon.BaseRobot 都具有 Armor 和 Weapons 属性,则无需对 MilitaryRobot 施法。如果不是所有 Weapon.BaseRobot 都具有这些属性,您不妨更改方法签名以接受该方法知道如何处理的一种具体类型。

请注意,在编写此类代码时,接口非常有用。例如,您可以定义 IWeaponized 并让任何有武器的东西实现该接口,而任何有装甲的东西都可以实现一个接口 IArmored。既是武器化又是装甲的东西将实现这两​​个接口。您的泛型方法将接受接口,而不是类。

【讨论】:

    【解决方案2】:

    Eric 描述的界面方法是解决此类游戏对象问题的绝佳解决方案,但组合也可以工作。

    问题在于,您似乎在这里混合了组合和继承模式,结果会有点混乱。

    拥有具有武器/盔甲属性的更高级别“游戏对象”的想法很好。这是一种构图模式。

    但是为什么会有一个 Robot/MilitaryRobot 继承模式呢?您可以分解出区分这些不同类型之间差异的特征,并将它们更改为更通用的“Actor”或“GameObject”上的属性。

    像这样的组合模式在游戏设计中非常有用。但是继承模式可能会导致代码脆弱,几乎不可能重构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 2018-11-08
      • 2019-09-21
      • 2022-01-15
      • 1970-01-01
      相关资源
      最近更新 更多