将对象转换为子类型? (向下转换)

时间:2018-06-22 18:48:37

标签: c# class unity3d parent-child downcast

我知道,垂头丧气可能不是实现我的愿望的最佳方法,但这至少表明我心中有种种解决方案。欢迎任何其他建议。

好的,也可以深入研究我的代码:

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 个答案:

答案 0 :(得分:2)

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

示例:

abstract class Item
{
    public abstract void Equip();
}

class Weapon
{
    public override void Equip()
    {
        equipWeapon(this);
    }
}

然后triggerItem变得微不足道:

public void triggerItem(Item item) 
{
    item.Equip();
}       

如果您需要在其他类(例如,包含triggerItem的任何类)上调用equipWeapon,则可以使该类成为接口的一部分:

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

答案 1 :(得分:-2)

这解决了。

public void triggerItem(Item item) 
{
    if (item is Weapon) {
        equipWeapon((Weapon)item);
    }       
}

public void equipWeapon(Weapon weapon) 
{

}

您在这里所做的是将Item下传到Weapon,同时传递到equipWeapon(Weapon weapon)