前言:在前面的博文中,我介绍了C#中的虚方法与抽象方法,本博文将对两者的区别进行详细叙述。参考博文:浅谈C#中虚方法与隐藏方法的区别、深究C#中的抽象类、抽象属性、抽象方法
一、虚方法的回顾
- 虚方法必须使用virtual修饰。
- 虚方法同抽象方法(abstract)一样,使用override关键字重写。
- 虚方法在子类中可以实现,也可以不实现。
- 虚方法必须有方法体哪怕是空的。
- 虚方法不能使用sealed修饰,否则不能重写。
二、抽象方法的回顾
- 抽象方法是隐式的virtual方法。
- 只允许在抽象类中使用抽象方法声明。
- 因为抽象方法声明不提供实实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。例如:
public abstract void MyMethod();
- 实现由overriding方法提供,它是非抽象类的成员。
- 在抽象方法声明中使用static或virtual修饰符是错误的。
三、虚方法与抽象方法的区别
- 关键字不同抽象方法(abstract)虚方法(virtual)。
- 抽象方法必须在抽象类中,而虚方法不需要。
- 抽象方法在父类中不可以实现,虚方法可以实现。
- 抽象方法子类必须实现抽象方法,虚方法可以选择实现或者不实现。
四、对于两者区别的总结
抽象方法是只有定义、没有实际方法体的函数,它只能在抽象函数中出现,并且在子类中必须重写;虚方法则有自己的函数体,已经提供了函数实现,但是允许在子类中重写或覆盖。重写的子类虚函数就是被覆盖了。