Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从子未知子类调用函数?_C#_Class_Inheritance_Abstract Class - Fatal编程技术网

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#。