我可以访问一个名为'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;
}
答案 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;。
像这样的合成模式在游戏设计中非常有用。但继承模式可能会导致脆弱,几乎不可能重构代码。