总结:C#虚方法与抽象方法的区别

虚方法与抽象方法区别

虚方法

抽象方法

用virtual修饰

用abstract修饰

要用方法体,哪怕是一个分号

不允许有方法体

可以被子类override(重写)

必须被子类override(重写)

除了密封类都可以写

只能在抽象类中

代码示例

 完整代码如下

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace ConsoleApplication1
 8 {
 9     public class 虚方法与抽象方法区别
10     {
11         /// <summary>
12         /// 程序入口执行
13         /// </summary>
14         /// <param name="age"></param>
15         public static void Main(string[] age)
16         {
17             StudentA stu = new StudentA();
18             stu.People();
19             StudentB stub = new StudentB();
20             stub.GetPrint();
21             Console.ReadLine();
22         }
23     }
24 
25     /// <summary>
26     /// 定义一个抽象类
27     /// 特点:1、抽象方法没有方法体;2、抽象方法只能在抽象类中;3、必须被子类Override重写
28     /// </summary>
29     public abstract class 抽象类
30     {
31         /// <summary>
32         /// 使用关键字abstract定义的抽象方法
33         /// </summary>
34         public abstract void People();
35     }
36 
37     /// <summary>
38     /// 继承基类的方法需要override重写基类的抽象方法
39     /// </summary>
40     public class StudentA : 抽象类
41     {
42         /// <summary>
43         /// Override重写覆盖
44         /// </summary>
45         public override void People()
46         {
47             Console.WriteLine("学生是祖国的花朵、未来的希望!");
48         }
49     }
50 
51     /// <summary>
52     /// 普通方法
53     /// </summary>
54     public class PanentClass
55     {
56         /// <summary>
57         /// 使用关键字virtual定义的虚方法
58         /// 特点:1、要用方法体;2、除了密封类都可以用;3、必须被子类Override重写
59         /// </summary>
60         public virtual void GetPrint()
61         {
62             Console.WriteLine("您好,你中了100万!请领取。");
63         }
64     }
65 
66     public class StudentB : PanentClass
67     {
68         /// <summary>
69         /// 实现基类的虚方法实现
70         /// </summary>
71         public override void GetPrint()
72         {
73             Console.WriteLine("您好,最终领取了80万了。");
74         }
75     }
76 }
View Code

错误一、子类必须实现基类的抽象方法

 错误二、虚方法没有方法体

 如何选择使用虚方法还是抽象方法呢?

虚法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。

选择考虑方式:

  • 1、虚方法有方法体了,有实例了。如果子类有存在一样的实例可以共用时,其实子类不用重写方法体实现了。这是可以考虑用虚方法。
  • 2、抽象方法只定义一个无方法体的方法,子类必须重写抽象方法才能实例。

例子:学生们的爱好

抽象方法:如果要求实现输出各位同学爱好不同,则定义一个基类“学生们的爱好”抽象类,子类就是“各位同学调用抽象方法实现,某某同学喜欢打蓝球,某某同学喜欢打兵乓球。”

虚方法:如果3个同学中,得知A同学喜欢打篮球、B同学也喜欢打篮球、C同学喜欢打兵乓球。则定义一个虚方法“A同学喜欢打篮球”,子类B可以直接调用基类的虚方法不用覆盖虚方实例。

这是我个人理解的,不知道是否正确。

原文地址:https://www.cnblogs.com/liuzz/p/14530477.html