一、Virtual办法(虚办法)
virtual关键字用于在基类中润饰办法。virtual的运用会有两种状况:
状况1:在基类中界说了virtual办法,但在派生类中没有重写该虚办法。那么在对派生类实例的调用中,该虚办法运用的是基类界说的办法。
状况2:在基类中界说了virtual办法,然后在派生类中运用override重写该办法。那么在对派生类实例的调用中,该虚办法运用的是派生重写的办法。
当一个办法被声明为Virtual时,它是一个虚拟办法,直到你运用ClassNamevariable=newClassName();声明一个类的实例之前,它都不存在于真实的内存空间中。这个关键字在类的承继中非常常用,用来提供类办法的多态性支持。
二、Abstract办法(笼统办法)
abstract关键字只能用在笼统类中润饰办法,并且没有详细的完成。笼统办法的完成有必要在派生类中运用override关键字来完成。
笼统办法声明运用,是有必要被派生类覆写的办法,笼统类就是用来被承继的;可以看成是没有完成体的虚办法;假如类中包括笼统办法,那么类就有必要界说为笼统类,不论是否还包括其他一般办法;笼统类不能有实体的。
三、多态
C#中多态的完成分为了两种,一种是编译时多态,一种是运行时多态
|-编译时多态经过一个类中多个办法的重载来完成的多态,系统在编译的时分,依据传递的参数确定详细调用哪个重载的办法;
|-运行时多态经过virtual函数(虚函数)、笼统办法完成的多态,派生类去override虚函数或笼统办法,从而完成运行时多态.
四、abstract的用法
[C#]纯文本检查
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceConsoleApplication3
{
publicabstractclassBook
{
//笼统办法,不含主体,笼统办法地点类有必要为笼统类,派生类有必要完成该办法
publicabstractvoidIntroduce();
}
publicclassJavaBook:Book
{
//完成笼统办法,有必要完成,注意!有必要添加override关键字
publicoverridevoidIntroduce()
{
Console.WriteLine(“I’mJava”);
}
}
publicclasstest
{
publictest()
{
JavaBookjavaBook=newJavaBook();
javaBook.Introduce();//将调用JavaBook中Introduce()
Bookbook=newJavaBook();
book.Introduce();//将调用JavaBook中Introduce()
}
publicstaticvoidMain()
{
testt=newtest();
}
}
}
五、virtual的用法以及override的用法
[C#]纯文本检查
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespaceConsoleApplication2
{
publicabstractclassBook
{
publicvirtualvoidIntroduce()
{
Console.WriteLine(“I’mbook”);
}
publicvirtualvoidSayHi()
{
Console.WriteLine(“Hi,I’mbook”);
}
}
publicclassJavaBook:Book
{
publicoverridevoidIntroduce()
{
Console.WriteLine(“I’mJava”);
}
//注意,此办法没有override父类的办法
publicvoidSayHi()
{
Console.WriteLine(“Hi,I’mJava”);
}
}
publicclasstest
{
publictest()
{
JavaBookjavaBook=newJavaBook();
Bookbook=newJavaBook();
javaBook.Introduce();//将调用JavaBook中Introduce()
book.Introduce();//将调用JavaBook中Introduce()
javaBook.SayHi();//将调用JavaBook中SayHi()
book.SayHi();//将调用Book中SayHi()
}
publicstaticvoidMain()
{
testt=newtest();
}
}
}
六、virtual和abstract的差异慨括
(1)、virtual润饰的办法有必要有完成(哪怕是只是添加一对大括号),而abstract润饰的办法必定不能完成。如关于virtual润饰的办法假如没有完成:
(2)、virtual可以被子类重写,而abstract有必要被子类重写,假如重写了virtual润饰的办法,前面有必要添加override(这样就告知了编译器你要重写虚拟办法),而且有必要有完成,否则编译犯错;
(3)、假如类成员被abstract润饰,则该类前有必要添加abstract,由于只有笼统类才可以有笼统办法。
(4)、无法创立abstract类的实例,只能被承继无法实例化,比如:BaseTest2base2=newBaseTest2();将出现编译过错:笼统类或接口不能创立实例。
(5)、C#中假如要在子类中重写办法,有必要在父类办法前加virtual,在子类办法前添加override,这样就避免了程序员在子类中不小心重写了父类办法。
(6)、abstract办法有必要重写,virtual办法有必要有完成(即使它是在abstract类中界说的办法).
评论前必须登录!
注册