Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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# 通过foreach访问时,访问列表中的子类的方法_C#_List_Polymorphism_Subclass_Superclass - Fatal编程技术网

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

C# 通过foreach访问时,访问列表中的子类的方法,c#,list,polymorphism,subclass,superclass,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&

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

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());
因此,由于每个对象都被强制转换为一个超类,因此它使用isSuper()的超类方法,并且总是作为一个超类进行响应

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

您必须在
类中的
super
类属性才能获得所需的行为或属性

相应地更改类定义:

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

public class sub : super
{ 
  public override Boolean isSuper()
  {
    return false;
  }
}
您必须在
类中的
super
类属性才能获得所需的行为

相应地更改类定义:

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

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

与Java不同,您必须显式地将成员声明为虚拟成员,并在C#中显式地覆盖它们(使用override关键字)。旁注:如果您计划将Java示例复制/粘贴为C#(这是基于编码约定完成的),最好检查Java与C#之间的差异。。。例如数字类型或默认的虚拟行为。另外,注意编译器警告也有帮助,尤其是当您的代码无法按预期工作时。在这种情况下,它会警告您正在隐藏isSuper方法。与Java不同,您必须在C#中显式声明成员为虚拟成员并显式重写它们(使用override关键字)。旁注:如果您计划将Java示例复制/粘贴为C#(这是基于编码约定完成的)检查Java与C的差异可能是个好主意。。。例如数字类型或默认的虚拟行为。另外,注意编译器警告也有帮助,尤其是当您的代码无法按预期工作时。在本例中,它警告您正在隐藏isSuper方法。我甚至建议将代码变得更符合C#:
public virtual bool IsBase{get{return true;}}
等。。。有那么简单吗?那么为什么编译器允许它编译呢?没有显式重写就没有意义。@user3533030因为它不是一个错误,而是一个警告(请考虑更改所有项目的“将警告视为错误”)@user3533030-在某些情况下确实有意义,编译器发出了一条警告,要求您重写该方法,或者用
new
将其标记为隐藏(但不是重写)基类方法:
public class Sub:Super{new public bool IsSuper(){…}}
@user3533030 C#经过精心设计,以避免脆弱的基类问题。这就是不产生错误所能做的。我甚至建议让代码对C#更习惯:
public virtual bool IsBase{get{return true;}}
etc.Wow…这么简单?那么为什么编译器允许它编译?如果没有显式重写,它就没有意义。@user3533030因为它不是一个错误,而是一个警告(考虑更改所有项目的“将警告视为错误…”@user3533030-在某些情况下它确实有意义,编译器发出警告说您应该重写该方法,或者用
new
标记它以使其隐藏(但不重写)基方法:
public class Sub:Super{new public bool IsSuper(){…}
@user3533030 C#经过精心设计,避免了脆弱的基类问题。这就是不产生错误的作用。