通过foreach访问时,C#/访问列表中子类的方法

时间:2014-05-29 08:09:42

标签: c# list polymorphism subclass superclass

尝试了解如何在列表作为超类键入时访问子类的方法。这应该是基本的多态性,但我感到困惑。

public class super
{ 
  public Boolean isSuper()
  {
    return true;
  }
}

public class sub : super
{ 
  public Boolean isSuper()
  {
    return false;
  }
}

现在我列出这些对象

List <super> myList = new List<super>();
myList.Add(new super());
myList.Add(new sub());

现在我尝试让列表中的每个对象查询自己以查看它是超类还是子类

foreach(super objInList in myList)
{
  if(objInList.isSuper())
    Debug.Print("Super");
  else
    Debug.Print("Sub");
}

所以会发生的事情是,由于每个对象都被强制转换为超类,它使用isSuper()的超类方法,并且它总是以超类的形式响应。

我想访问子类' isSuper(),而不必在循环的每次迭代中使用 instanceof 。显然,如果您可以查询对象以查看它是超级还是子级,那么O / S中的某些内容就知道了对象的类型。为什么要通过猜测游戏来检查每种可能性?为什么不让它深入到适当的子类并执行适当的方法?有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:9)

您必须在super课程中使用override sub类属性才能获得所需的行为。

相应地更改您的班级定义:

public class super
{ 
  public virtual Boolean isSuper()
  {
    return true;
  }
}

public class sub : super
{ 
  public override Boolean isSuper()
  {
    return false;
  }
}