扯不清楚的virtual和abstract
Posted 淡定,淡定
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扯不清楚的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类
以上是关于扯不清楚的virtual和abstract的主要内容,如果未能解决你的问题,请参考以下文章