我有以下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()这样的函数。 有谁知道我怎么能做到这一点?
答案 0 :(得分:1)
为了实现想要的行为,您需要将类型为item1
的{{1}}对象分别转换为Item
或Weapon
类型。
例如:
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()
。