传入对象并即时转换

pass in object and convert it on the fly

我可以访问一个抽象方法,该方法采用名为 '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;

}

I have access to an abstract method that takes a type called 'Weapon'.

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

如果所有 Weapon.BaseRobot 都具有 Armor 和 Weapons 属性,则无需转换为 MilitaryRobot。如果并非所有 Weapon.BaseRobot 都具有这些属性,您也可以更改方法签名以接受该方法知道如何处理的一种具体类型。

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

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

问题是您在这里混合了组合和继承模式,最终会变得有点混乱。

具有 Weapon/Armour 属性的更高级别 "game object" 的想法很好。这是一个构图模式。

但为什么会有 Robot/MilitaryRobot 继承模式呢?您可以提取出区分这些不同类型之间差异的特征,并将它们更改为更通用的 "Actor" 或 "GameObject".

上的属性

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