如何从Child未知的子类中调用函数?

时间:2017-01-08 18:15:44

标签: c# class inheritance abstract-class

我有以下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;
  }
}

Weapon和Armor从Item继承属性。

然后一个功能喜欢这个。

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

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

Item item1 = getItem();

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

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

2 个答案:

答案 0 :(得分:1)

为了实现想要的行为,您需要将类型为item1的{​​{1}}对象分别转换为ItemWeapon类型。

例如:

Armour

另外,请注意,如果if(item1.getItemType().Equals("weapon")) lblText = ((Weapon)item1).getPower(); else lblText = ((Armour)item1).getDefence(); 对象包含的item1对象不等于"武器"则转换会在运行时抛出异常。串。主要是因为itemType方法创建了getItem()类型的对象。

答案 1 :(得分:1)

您不需要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#命名约定,你应该使用 camel casing 作为方法名称,而不是getDefence()它应该是GetDefence()