C#中Person s1=new Student()未触发多态的问题求助
问题分析与解决
这是因为C#和Java在方法多态的默认规则上存在差异:
- Java里非
static、final、private的方法默认是虚方法,天然支持多态 - C#里的方法默认是**非虚(密封)**状态,必须显式声明才能让子类重写实现多态
正确的代码实现方式
1. 父类Person中声明虚方法
给Comment方法加上virtual关键字,标记它允许被子类重写:
public class Person { // 用virtual标记允许重写 public virtual void Comment() { Console.WriteLine("Person的Comment方法"); } }
2. 子类Student中重写方法
给子类的Comment方法加上override关键字,明确表示这是重写父类的虚方法:
public class Student : Person { // 用override标记重写父类的virtual方法 public override void Comment() { Console.WriteLine("Student的Comment方法"); } }
3. 验证多态效果
现在执行Person s1 = new Student(); s1.Comment();,就会触发子类的Comment方法,正常实现多态。
额外注意:避免误用new关键字
如果你的Student类里写的是public new void Comment(),这不是重写,而是隐藏父类的方法,此时用父类引用调用时,仍然会执行父类的方法,这也是常见的错误点。
内容的提问来源于stack exchange,提问作者LeotrimR
相关产品推荐
相关产品推荐

