猿问

将对象强制转换为子类型?(低头)

我明白,沮丧可能不是实现我的愿望的最佳方式,但它至少表明了我脑海中闪过的那种解决方案。欢迎任何其他建议。


好吧,不妨深入研究一下我的代码:


public void triggerItem(Item item) 

{

    if (item is Weapon) {

        equipWeapon(item);

    }       

}


public void equipWeapon(Weapon weapon) 

{


}

所以我基本上有一个库存设置,当然库存将包含各种类型的物品(武器,盔甲,消耗品等)正如你所看到的,我有一个 Item 类,然后是一个 Weapon 类和一堆其他的都继承Item。


现在,我打算在玩家单击其库存中的项目时调用此函数,然后根据特定的项目类型调用不同的函数。


但是因为equipWeapon()收到武器,所以当我只是给它传递一个物品时它不喜欢它。


我知道我可以将代码更改为equipWeapon(Item item),但是对象的最终目标需要一个 Weapon 类型,而我不愿意更改它。这似乎是一个肮脏的解决方案,朝着错误的方向迈出了一步,但如果我错了,请随时纠正我。


阿晨1998
浏览 164回答 2
2回答

绝地无双

这就解决了。public void triggerItem(Item item) {    if (item is Weapon) {        equipWeapon((Weapon)item);    }       }public void equipWeapon(Weapon weapon) {}你在这里做什么是向下转换的Item以Weapon同时传递到equipWeapon(Weapon weapon)。

动漫人物

给你的基类一个方法,让它被装备,并在知道如何装备自己的特定于类型的类中实现它。例子:abstract class Item{    public abstract void Equip();}class Weapon{    public override void Equip()    {        equipWeapon(this);    }}然后 triggerItem 变得微不足道:public void triggerItem(Item item) {    item.Equip();}       如果你需要在不同的类(例如任何包含的类triggerItem)上调用装备武器,你可以使类成为接口的一部分:abstract class Item{    public abstract void Equip(Game context);}class Weapon{    public override void Equip(Game context)    {        context.equipWeapon(this);    }}class Game{    public void triggerItem(Item item)     {        item.Equip(this);    }       }
随时随地看视频慕课网APP
我要回答