c# - 将对象转换为子类型? (沮丧)

标签 c# class unity3d parent-child downcast

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

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

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

public void equipWeapon(Weapon weapon) 
{

}

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

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

但是因为 equipWeapon() 接收到 Weapon,它不喜欢我只给它传递一个 Item。

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

最佳答案

为您的基类提供一个使其被装备的方法,并在知道如何装备自身的特定类型类中实现它。

例子:

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 的类),您可以将该类作为接口(interface)的一部分:

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

关于c# - 将对象转换为子类型? (沮丧),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50994016/

相关文章:

javascript - 通过泛型函数动态修改 TypeScript 类

javascript - 如何使用类语法复制 Javascript 构造函数和原型(prototype)对象

c# - 返回派生类作为基泛型类

c# - 在 Unity3d 中使用 IEnumerator 与 IEnumerable 的嵌套协程

c# - 从数据库填充列表 (SQLite)

c# - 使用 Parallel.ForEach 限制每秒启动的 API 请求数

php - WooCommerce 产品 SKU 检查不起作用

c# - Mathf.Floor 与 (int) 在性能上的对比

C# TypeConverter long 到枚举类型在 ChangeType 上失败

c# - 带有 SQLite 和 Linq 的 Queryable.Intersect() 未给出预期结果