C# 如何从子未知子类调用函数?
我有以下三门课:C# 如何从子未知子类调用函数?,c#,class,inheritance,abstract-class,C#,Class,Inheritance,Abstract Class,我有以下三门课: class Item { protected String itemType; public String getItemType() { return itemType; } } class Weapon:Item { private int power; public int getPower() { return power; } } class Armour:Item {
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();
我显然收到了错误消息,指出类项没有像getDefense()或getPower()这样的函数。
有人知道我如何做到这一点吗?为了实现想要的行为,你需要将
Item
类型的Item
对象分别投射到武器或盔甲类型中
例如:
if(item1.getItemType().Equals("weapon"))
lblText = ((Weapon)item1).getPower();
else
lblText = ((Armour)item1).getDefence();
另外,请注意,如果item1
对象包含不等于“武器”字符串的itemType
,则强制转换将在运行时引发异常。主要是因为getItem()
方法创建了一个武器类型的对象
为了实现想要的行为,你需要将Item
类型的Item
对象分别投射到武器类型
或盔甲类型中
例如:
if(item1.getItemType().Equals("weapon"))
lblText = ((Weapon)item1).getPower();
else
lblText = ((Armour)item1).getDefence();
另外,请注意,如果item1
对象包含不等于“武器”字符串的itemType
,则强制转换将在运行时引发异常。主要是因为getItem()
方法创建了一个类型为armor
的对象,所以您不需要getItemType()
来完成所需的任务。您可以使用C#is
操作符来实现这一点。引自
检查对象是否与给定类型兼容。例如
下面的代码可以确定对象是否是
MyObject类型,或从MyObject派生的类型:
您可以将代码更改为:
Item item1 = getItem();
if (item1 is Weapon)
{
lblText = ((Weapon)item1).getPower();
}
else if (item1 is Armour)
{
lblText = ((Armour)item1).getDefence();
}
此外,根据C#命名约定,您应该使用驼峰式大小写作为方法名称,因此不应该使用getDefence()
而是getDefence()
,您不需要getItemType()
来完成所需的任务。您可以使用C#is
操作符来实现这一点。引自
检查对象是否与给定类型兼容。例如
下面的代码可以确定对象是否是
MyObject类型,或从MyObject派生的类型:
您可以将代码更改为:
Item item1 = getItem();
if (item1 is Weapon)
{
lblText = ((Weapon)item1).getPower();
}
else if (item1 is Armour)
{
lblText = ((Armour)item1).getDefence();
}
此外,根据C#命名约定,您应该使用驼峰式大小写作为方法名称,因此除了其他以外,它应该是getDefence()
,而不是getDefence(),现在是学习属性和C#命名约定的好时机——目前这段代码读起来更像Java而不是C#。除此之外,现在是学习属性和C#命名约定的好时机——目前这段代码读起来更像Java而不是C#。