最近学习Quratz,一个任务调度框架,查看代码发现很多地方使用virtual关键字,其实不仅如此,在C# asp.net框架里面,以及公司封装的框架,也非常多地方使用Virtual关键字,虽然工作几年
却感觉懂,又好像不懂,心中没底,因此写下这篇博文,
总结是:
虚方法标记,就是让派生类重写的,从而覆盖父方法,有点像接口的作用,
私有就是类自己使用,
保护是继承还可以用,
内部是当前程序集,
class 默认是访问级别是内部的,成员默认私有
参考https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/accessibility-levels
示例代码
class ParentVitual {
void Test0() {
}
internal void Test1() {
Test0();
Console.WriteLine("Test1");
}
public virtual void Test2()
{
Console.WriteLine("virtual Test2");
}
public virtual void Test3()
{
Console.WriteLine("virtual Test3");
}
}
class Son : ParentVitual {
new internal void Test1()
{
Console.WriteLine("parent Test1");
}
new public void Test2()
{
Console.WriteLine("parent Test2");
}
//只有虚方法,抽象方法才能重写
override public void Test3()
{
Console.WriteLine("parent Test3");
}
}
控制器启用程序
static void Main(string[] args)
{
new Internal();//没写类前面访问属性,默认是内部的级别访问,即当前程序集
//私有就是类自己使用,保护是继承还可以用,内部是当前程序集,
ParentVitual parent = new Son();
//没有写虚方法,仍然可以用new关键字
parent.Test1();
//父引用,仍然调用父类中方法,即便是虚方法
parent.Test2();
//所谓覆盖,可简单理解只剩下一个方法的含义
parent.Test3();
/*
Test1
virtual Test2
parent Test3
请按任意键继续. . .
}
另一个class文件
class Internal
{
}
关于new 与override区别,见https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/versioning-with-the-override-and-new-keywords
第二部分:关于抽象方法和虚方法
非常容易混淆,也是查看源代码过程中,常见的修饰
重点来说,如果类中从成员有虚方法,必须标记为抽象的类,且没有实现的方法提,类似接口
而虚方法则一定要有实现,
https://www.cnblogs.com/wang7/archive/2012/04/17/2453624.html
结尾:工作项目中用到封装,比如以下代码,就用到接口interface ,抽象类,虚方法
interface IInterOpEventHandler<TEvent> : ICZEventHandler<TEvent>
where TEvent : CZInterOpEvent
{
}
abstract class InterOpEventHandlerBase<TEvent> : IInterOpEventHandler<TEvent>
where TEvent : CZInterOpEvent
{
/// <summary>
/// 处理事件
/// </summary>
/// <param name="ev"></param>
public virtual void Handle(TEvent ev)
{
if (ev == null) return;
HandleLocally(ev);
}
/// <summary>
/// 本地处理事件
/// </summary>
protected abstract void HandleLocally(TEvent ev);
}