如何从子未知子类调用函数



我有以下3个类:

class Item
{       
   protected String itemType;
   public String getItemType()
   {
      return itemType;
   }
}
class Weapon:Item
{
   private int power;
   public int getPower()
   {
      return power;
   }
}
class Armour:Item
{
  private int defence;
  public int getDefence()
  {
     return defence;
  }
}

武器和盔甲继承物品的属性。

然后一个函数像这样。

public Item getItem()
{
  return new Weapon();
}

我的问题是我需要做这样的事情,但它不起作用:

Item item1 = getItem();
if(item1.getItemType().Equals("weapon"))
    lblText = item1.getPower();
else
    lblText = item1.getDefence();

我显然收到错误消息,指出类 Item 没有像 getDefense() 或 getPower() 这样的函数。有谁知道我该如何做到这一点?

你不需要getItemType()来完成你需要的东西。可以使用 C# is运算符执行此操作。引用自 MSDN。

检查对象是否与给定类型兼容。例如, 以下代码可以确定对象是否是 MyObject 类型,或派生自 MyObject 的类型:

if (obj is MyObject)  
{  
}  

您可以将代码更改为以下内容:

Item item1 = getItem();
if (item1 is Weapon)
{
    lblText = ((Weapon)item1).getPower();
}
else if (item1 is Armour)
{
    lblText = ((Armour)item1).getDefence();
}

此外,根据 C# 命名约定,您应该对方法名称使用驼峰大小写,而不是getDefence()它应该是GetDefence()

为了实现所需的行为,您需要将类型为 Itemitem1 对象分别转换为类型 WeaponArmour

例如:

if(item1.getItemType().Equals("weapon"))
    lblText = ((Weapon)item1).getPower();
else
    lblText = ((Armour)item1).getDefence();

另外,请注意,如果item1对象包含不等于"weapon"字符串的itemType,则强制转换将在运行时引发异常。主要是因为getItem()方法创建了一个类型为 Weapon 的对象。

最新更新