|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
其实net网页编程之所以在曾经独步天下,就是因为他的跨平台、安全性,这两方面,效率可不是net网页编程的强项,反而是他最短的一块挡板,虽然net总是用理论证明比.NET快。系列文章目次索引:《你必需晓得的.NET》
本文将先容以下内容:
- 甚么是覆写,甚么是重载
- 覆写与重载的区分
- 覆写与重载在多态特征中的使用
1.弁言
覆写(override)与重载(overload),是成绩.NET面向对象多态特征的基础手艺之一,两个貌似类似而实则否则的观点,经常带给我们良多的曲解,因而有需要以专题来会商分明其区分,而更主要的是存眷其在多态中的使用。
在系列中,我们前后都有关于这一话题的点滴叙述,本文以专题的情势再次做以深度会商,相干的内容请对前文做以参考。
2.熟悉覆写和重载
从一个示例入手下手来熟悉甚么是覆写,甚么是重载?
abstractclassBase
{
//界说虚办法
publicvirtualvoidMyFunc()
{
}
//参数列表分歧,virtual不敷以辨别
publicvirtualvoidMyFunc(stringstr)
{
}
//参数列表分歧,前往值分歧
publicboolMyFunc(stringstr,intid)
{
Console.WriteLine("AAA");
returntrue;
}
//参数列表分歧体现为个数分歧,大概不异地位的参数范例分歧
publicboolMyFunc(intid,stringstr)
{
Console.WriteLine("BBB");
returnfalse;
}
//泛型重载,同意参数列表不异
publicboolMyFunc<T>(stringstr,intid)
{
returntrue;
}
//界说笼统办法
publicabstractvoidFunc();
}
classDerived:Base
{
//隔绝父类成员
publicnewvoidMyFunc()
{
}
//覆写基类成员
publicoverridevoidMyFunc(stringstr)
{
//在子类中会见父类成员
base.MyFunc(str);
}
//覆写基类笼统办法
publicoverridevoidFunc()
{
//完成覆写办法
}
}
2.1覆写基本篇
覆写,又称重写,就是在子类中反复界说父类办法,供应分歧完成,存在于有承继干系的父子干系。当子类重写父类的虚函数后,父类对象就能够依据依据付与它的分歧子类指针静态的挪用子类的办法。从示例的剖析,总结覆写的基础特性包含:
- 在.NET中只要以virtual和abstract标志的虚办法和笼统办法才干被间接覆写。
- 覆写以关头字override标志,夸大承继干系中对基类办法的重写。
- 覆写办法请求具有不异的办法署名,包含:不异的办法名、不异的参数列表和不异的前往值范例。
观点:虚办法
虚办法就是以virtual关头字润色并在一个或多个派生类中完成的办法,子类重写的虚办法则以override关头字标志。虚办法挪用,是在运转时断定依据其挪用对象的范例来断定挪用得当的覆写办法。.NET默许长短虚办法,假如一个办法被virtual标志,则不成再被static、abstrcat和override润色。
观点:笼统办法
笼统办法就是以abstract关头字润色的办法,笼统办法能够看做是没有完成体的虚办法,而且必需在派生类中被覆写,假如一个类包含笼统办法,则该类就是一个笼统类。因而,笼统办法实在隐含为虚办法,只是在声明和挪用语法上有所分歧。abstract和virtual一同利用是毛病的。
2.2重载基本篇
重载,就是在统一个类中存在多个同名的办法,而这些办法的参数列表和前往值范例分歧。值得注重的是,重载的观点并不是面向对象编程的范围,从编译器角度了解,分歧的参数列表、分歧的前往值范例,就意味着分歧的办法名。也就是说,办法的地点,在编译期就已断定,是这一种静态绑定。从示例中,我们总结重载的基础特性包含:
- 重载存在于统一个类中。
- 重载办法请求具有不异的办法名,分歧的参数列表,前往值范例能够不异也能够分歧(经由过程operatorimplicit能够完成必定水平的前往值重载,不外不值得保举)。
- .NET2.0引进泛型手艺,使得不异的参数列表、不异的前往值范例的情形也能够组成重载。
3.在多态中的使用
多态性,复杂的说就是“一个接口,多个办法”,详细体现为不异的办法署名代表分歧的办法完成,统一操纵感化于分歧的对象,发生分歧的实行了局。在.NET中,覆写完成了运转时的多态性,而重载完成了编译时的多态性。
运转时的多态性,又称为静态联编,经由过程虚办法的静态调剂,在运转时依据实践的挪用实例范例决意挪用的办法完成,从而发生分歧的实行了局。
classBase
{
publicvirtualvoidMyFunc(stringstr)
{
Console.WriteLine("{0}inBase",str);
}
}
classDerived:Base
{
//覆写基类成员
publicoverridevoidMyFunc(stringstr)
{
Console.WriteLine("{0}inDerived",str);
}
publicstaticvoidMain()
{
BaseB=newBase();
B.MyFunc("Hello");
DerivedA=newDerived();
B=A;
B.MyFunc("Morning");
}
}
从了局中可知,对象B两次实行B.MyFunc挪用了分歧的办法,第一次挪用基类办法MyFunc,而第二次挪用了派生类办法MyFunc。在实行过程当中,对象B前后指向了分歧的类的实例,从而静态挪用了分歧的实例办法,明显这一实行操纵并不是断定于编译时,而是在运转时依据对象B实行的分歧范例来断定的。我们在此不剖析假造办法的静态调剂机制,而只存眷经由过程虚办法覆写而完成的多态特征,具体的完成机制请参考本系列的别的内容。
编译时的多态性,又称为静态联编,一样平常包含办法重载和运算符重载。关于非虚办法来讲,在编译时经由过程办法的参数列表和前往值范例决意分歧操纵,完成编译时的多态性。比方,在实践的开辟过程当中,.NET开辟工具VisualStudio的智能感知功效就很好的为办法重载供应了很好的交互手腕,比方:
<br>
从智能感知中可知办法MyFunc在派生类Derived中有三次重载,挪用哪一种办法由程序开辟者依据其参数、前往值的分歧而决意。因而可知,办法重载是一种编译时的多态,对象A挪用哪一种办法在编译时就已断定。
4.对照,仍是划定规矩
- 假如基会见援用的是一个笼统办法,则将招致编译毛病。
abstractclassBase
{
publicabstractvoidFunc();
}
classDerived:Base
{
//覆写基类笼统办法
publicoverridevoidFunc()
{
base.Func();
}
}
- 虚办法不克不及是静态的、密封的。
- 覆写完成的多态断定于运转时,因而加倍的天真和笼统;重载完成的多态断定于编译时,因而加倍的复杂和高效。两者各有特性与使用,不成替换。
鄙人表中,将覆写与重载做以总结性的对照,次要包含:
注:参数列表不异暗示参数的个数不异,而且不异地位的参数范例也不异。
5.结论
深切的了解覆写和重载,是对多态特征和面向对象机制的无力增补,本文从基础观点到使用范畴将两个观点举行逐一梳理,经由过程对照收拾区分,还覆写和重载以更周全的认知角度,同时也更能从正面深切的懂得运转时多态与编译时多态的分歧情形。
参考文献
(web)TerryLee,再谈重载与覆写,http://www.ckuyun.com/Terrylee/archive/2006/03/10/347104.html
(web)丢失的BLOGS,C#泛型,http://www.ckuyun.com/lianyonglove/archive/2007/07/27/720682.html
2007Anytao.com
来自:http://www.ckuyun.com/anytao/archive/2007/11/07/must_net_17.html
我觉得这个学习方法很重要。初学者应该跟我一样有同样一个毛病。那就是急于求成。很想就自己做出个小小的系统来。可真要动手,却又茫然而不知所措。为什么会这样呢?因为我们没有耐心去学习基础知识。写根本看不到什么效果的测试代码。 |
|