【问题标题】:Cast an object to child type? (Downcasting)将对象转换为子类型? (向下转型)
【发布时间】:2018-06-22 18:48:37
【问题描述】:

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

好的,那么不妨深入我的代码:

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

public void equipWeapon(Weapon weapon) 
{

}

所以我基本上设置了一个库存,当然库存将包含各种类型的物品(武器、盔甲、消耗品等)。如您所见,我有一个 Item 类,然后是 Weapon 类和一堆其他所有继承项目的人。

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

但是因为equipWeapon()收到了Weapon,所以它不喜欢我只是给它一个Item。

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

【问题讨论】:

  • 这应该是您设计中的一个大 reg 标志。您需要对接口进行编码并进行泛化
  • equip 方法作为抽象方法移动到 Item
  • 啊,当解决方案开始推出时,我以为我会觉得很傻。实际上,我今天早些时候从我的 Item 类中删除了equip() 方法,当时我被重组得意忘形了。我想有点脑残的时刻。非常感谢所有发帖的人。

标签: c# class unity3d parent-child downcast


【解决方案1】:

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

例子:

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

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

那么triggerItem就变得微不足道了:

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

如果您需要在不同的类上调用equipWeapon(例如,任何包含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);
    }       
}

【讨论】:

    【解决方案2】:

    这样就解决了。

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

    您在这里所做的是将Item 向下转换为Weapon,同时传递给equipWeapon(Weapon weapon)

    【讨论】:

    • 我准确地回答了他的问题,你不喜欢我的回答是什么?我错过了什么吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多