扯不清楚的virtual和abstract
定义Person类:
1 class Person 2 { 3 public void Say() 4 { 5 Console.WriteLine("I am a person"); 6 } 7 }
现在,我想定义一个Stu类, 并且继承Person类,并且我想让Stu类有属于自己的Say方法
1 class Stu:Person 2 { 3 public string school="Oxford"; 4 public void Say() 5 { 6 Console.WriteLine("I am a student from " + school); 7 } 8 }
然后,在Main函数中,分别实例化Person类和Stu类
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 Person person = new Person(); 6 person.Say(); 7 8 Stu stu= new Stu(); 9 stu.Say(); 10 11 person=stu; 12 person.Say(); 13 } 14 }
在控制台中,输入csc Program.cs编译,如下图
(请选择你自己喜欢的编译器,并包含编译器的位置到path环境变量中,如path=%path%;C:\Windows\Microsoft.NET\Framework64\v2.0.50727)
编译后,如上图我们看到有个警告,意思是Stu类中的Say方法,隐藏了Person类中的Say方法,如果确实有需要,喊我们显示地使用new关键字去隐藏,做如下改动
1 class Stu:Person 2 { 3 public string school="Oxford"; 4 public new void Say() 5 { 6 Console.WriteLine("I am a student from " + school); 7 } 8 }
编译后,没发现警告了,可运行效果并不是我想要的,最后一行的输出,并没有实现多态
现在在父类使用virtual关键字,在子类使用override关键字重写父类的方法。
1 class Person 2 { 3 public virtual void Say() 4 { 5 Console.WriteLine("I am a person"); 6 } 7 } 8 9 class Stu:Person 10 { 11 public string school="Oxford"; 12 public override void Say() 13 { 14 Console.WriteLine("I am a student from " + school); 15 } 16 }
运行效果如下:
这样,我们通过在父类使用virtual关键字修饰方法,在子类使用override关键字重写父类方法,这样我们就正确实现了多态。
除了virtual关键字,我们还可以使用abstract关键字修饰父类的方法,可以实现相类似的功能,但abstract修饰的方法不能有实现,并且该方法所在的类必须是abstract类
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?