为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
阿晨1998 2021-08-29 17:48:21
我明白,沮丧可能不是实现我的愿望的最佳方式,但它至少表明了我脑海中闪过的那种解决方案。欢迎任何其他建议。好吧,不妨深入研究一下我的代码:public void triggerItem(Item item) {    if (item is Weapon) {        equipWeapon(item);    }       }public void equipWeapon(Weapon weapon) {}所以我基本上有一个库存设置,当然库存将包含各种类型的物品(武器,盔甲,消耗品等)正如你所看到的,我有一个 Item 类,然后是一个 Weapon 类和一堆其他的都继承Item。现在,我打算在玩家单击其库存中的项目时调用此函数,然后根据特定的项目类型调用不同的函数。但是因为equipWeapon()收到武器,所以当我只是给它传递一个物品时它不喜欢它。我知道我可以将代码更改为equipWeapon(Item item),但是对象的最终目标需要一个 Weapon 类型,而我不愿意更改它。这似乎是一个肮脏的解决方案,朝着错误的方向迈出了一步,但如果我错了,请随时纠正我。
查看完整描述

2 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

这就解决了。


public void triggerItem(Item item) 

{

    if (item is Weapon) {

        equipWeapon((Weapon)item);

    }       

}


public void equipWeapon(Weapon weapon) 

{


}

你在这里做什么是向下转换的Item以Weapon同时传递到equipWeapon(Weapon weapon)。


查看完整回答
反对 回复 2021-08-29
?
动漫人物

TA贡献1815条经验 获得超10个赞

给你的基类一个方法,让它被装备,并在知道如何装备自己的特定于类型的类中实现它。


例子:


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);

    }       

}


查看完整回答
反对 回复 2021-08-29
  • 2 回答
  • 0 关注
  • 163 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信