扯不清楚的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的主要内容,如果未能解决你的问题,请参考以下文章

C#中virtual 方法和abstract方法的区别

virtual和abstract

c#中virtual, abstract和override的区别和用法?

C#中virtual和abstract的区别

virtual和abstract区别

C#中virtual和abstract的区别