我知道沮丧可能不是实现我愿望的最佳方式,但它至少表明了我脑海中闪过的解决方案。欢迎任何替代建议。
好吧,不妨深入研究我的代码:
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/