总结: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 }
错误一、子类必须实现基类的抽象方法
错误二、虚方法没有方法体
如何选择使用虚方法还是抽象方法呢?
虚法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。
选择考虑方式:
- 1、虚方法有方法体了,有实例了。如果子类有存在一样的实例可以共用时,其实子类不用重写方法体实现了。这是可以考虑用虚方法。
- 2、抽象方法只定义一个无方法体的方法,子类必须重写抽象方法才能实例。
例子:学生们的爱好
抽象方法:如果要求实现输出各位同学爱好不同,则定义一个基类“学生们的爱好”抽象类,子类就是“各位同学调用抽象方法实现,某某同学喜欢打蓝球,某某同学喜欢打兵乓球。”
虚方法:如果3个同学中,得知A同学喜欢打篮球、B同学也喜欢打篮球、C同学喜欢打兵乓球。则定义一个虚方法“A同学喜欢打篮球”,子类B可以直接调用基类的虚方法不用覆盖虚方实例。
这是我个人理解的,不知道是否正确。