志在指尖
用双手敲打未来

C#中virtual和abstract的区别讲解

virtualabstract都是用来润饰父类的,经过覆盖父类的界说,让子类重新界说。
它们有一个共同点:假如用来润饰办法,前面有必要增加public,要不然就会呈现编译过错:虚拟办法或笼统办法是不能私有的。究竟加上virtual或abstract便是让子类重新界说的,而private成员是不能被子类访问的。
但是它们的差异很大。(virtual是“虚拟的”,abstract是“笼统的”).
(1)virtual润饰的办法有必要有完成(哪怕是只是增加一对大括号),而abstract润饰的办法必定不能完成。如关于virtual润饰的办法假如没有完成:
[C#]纯文本检查
publicclassTest1
{
publicvirtualvoidfun1();
}
上面是过错写法“Test1.fun1()”有必要声明主体,由于它未标记为abstract、extern或partial
关于abstract润饰的办法假如有完成:C#中virtual和abstract的区别讲解
[C#]纯文本检查
publicabstractclassTest2
{
publicabstractvoidfun2(){}
}
上面是过错写法“Test2.fun2()”无法声明主体,由于它标记为abstract
(2)virtual能够被子类重写,而abstract有必要被子类重写
[C#]纯文本检查
classBaseTest1
{
publicvirtualvoidfun(){}//有必要有完成
}
classDeriveTest1:BaseTest1
{
//publicoverridevoidfun(){}
}
编译不会呈现过错,假如重写了virtual润饰的办法,前面有必要增加override(这样就告诉了编译器你要重写虚拟办法),并且有必要有完成,不然编译出错;
[C#]纯文本检查
abstractclassBaseTest2
{
publicabstractvoidfun();
}
classDeriveTest2:BaseTest2
{
//publicoverridevoidfun();过错1:没有完成
//publicvoidfun(){}过错2:重写时没有增加override
//overridevoidfun(){}过错3:虚拟成员或许笼统成员不能是私有的(只要在父类中声明晰虚拟成员或笼统成员,即使是承继的也要加上这个限制)
publicoverridevoidfun(){}//假如重写办法;过错:“A.DeriveTest2”不完成承继的笼统成员“A.BaseTest2.fun()”
}
(3)假如类成员被abstract润饰,则该类前有必要增加abstract,由于只要笼统类才能够有笼统办法。
(4)无法创立abstract类的实例,只能被承继无法实例化,比方:BaseTest2base2=newBaseTest2();将呈现编译过错:笼统类或接口不能创立实例。
(5)C#中假如要在子类中重写办法,有必要在父类办法前加virtual,在子类办法前增加override,这样就避免了程序员在子类中不小心重写了父类办法。
(6)abstract办法有必要重写,virtual办法有必要有完成(即使它是在abstract类中界说的办法).
[C#]纯文本检查
abstractpublicclassTest
{
//publicvirtualvoidPrinf();过错:virtual办法有必要有完成
publicvirtualvoidPrinf()//abstract类的virtual办法能够不重写;abstract办法有必要重写。
{
Console.WriteLine(“AbstractPrintf…”);
}
}
publicclassClass1:Test
{
/*
publicoverridevoidPrinf()//派生类中不重写abstract类的virtual办法照样能够运行,不过调用派生类目标的Printf办法时,调用的是父类的。
{
Console.WriteLine(“ClassOneOverridePrintf…”);
}
*/
}

未经允许不得转载:IT技术网站 » C#中virtual和abstract的区别讲解
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载