【发布时间】:2014-05-29 08:09:42
【问题描述】:
试图了解当列表被键入为超类时如何访问子类的方法。这应该是基本的多态性,但我很困惑。
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 中的某些内容就知道对象的类型。为什么要通过一个猜谜游戏来检查每一种可能性?为什么不让它深入到适当的子类并执行适当的方法呢?有没有办法实现这个目标?
【问题讨论】:
-
与 Java 不同,您必须在 C# 中显式声明成员为虚拟成员并显式覆盖它们(使用 override 关键字)。
-
旁注:如果您打算将 Java 示例复制/粘贴为 C#(您是根据编码约定进行的),那么检查 Java 与 C# 的差异可能是个好主意......就像数字类型或默认虚拟行为。
-
还有助于注意编译器警告,尤其是当您的代码无法按预期工作时。在这种情况下,它会警告您隐藏 isSuper 方法。
标签: c# list polymorphism subclass superclass