传入对象并在运行中转换它

时间:2015-10-23 17:16:56

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

我可以访问一个名为'Weapon'的抽象方法。

我传入的对象有对父对象的引用,但我必须进行转换。

做一次似乎工作正常,但对于其他方法,我可能需要传递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;

}

2 个答案:

答案 0 :(得分:4)

  

我可以访问一个抽象方法,该方法采用名为&#39; Weapon&#39;。

的类型。

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

如果所有Weapon.BaseRobot都具有Armor和Weapons属性,那么就没有必要强制转换为MilitaryRobot。如果不是所有的Weapon.BaseRobot都具有这些属性,您也可以更改方法签名以接受方法知道如何处理的一个具体类型。

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

答案 1 :(得分:1)

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

问题是看起来你在这里混合了组合和继承模式,最终会有点混乱。

拥有更高级别游戏对象的想法&#34;武器/护甲属性很好。这是一种构图模式。

但为什么会有Robot / MilitaryRobot继承模式呢?您可以分辨出区分这些不同类型之间差异的功能,并将它们更改为更通用的&#34; Actor&#34;或&#34; GameObject&#34;。

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