透明 发表于 2015-1-18 11:25:00

ASP.NET网页编程之[你必需晓得的.NET]第十七回:同床异梦:覆写和重载仓酷云

其实net网页编程之所以在曾经独步天下,就是因为他的跨平台、安全性,这两方面,效率可不是net网页编程的强项,反而是他最短的一块挡板,虽然net总是用理论证明比.NET快。系列文章目次索引:《你必需晓得的.NET》
本文将先容以下内容:


[*]甚么是覆写,甚么是重载
[*]覆写与重载的区分
[*]覆写与重载在多态特征中的使用

<br>
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();
}
}


[*]虚办法不克不及是静态的、密封的。
[*]覆写完成的多态断定于运转时,因而加倍的天真和笼统;重载完成的多态断定于编译时,因而加倍的复杂和高效。两者各有特性与使用,不成替换。
鄙人表中,将覆写与重载做以总结性的对照,次要包含:
划定规矩
覆写(override)
重载(overload)
存在地位
存在于有承继干系的分歧类中
存在于统一个类中
挪用机制
运转时断定
编译时断定
办法名
必需不异
必需不异
参数列表
必需不异
必需分歧
前往值范例
必需不异
能够不不异
泛型办法
能够覆写
能够重载

注:参数列表不异暗示参数的个数不异,而且不异地位的参数范例也不异。
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
我觉得这个学习方法很重要。初学者应该跟我一样有同样一个毛病。那就是急于求成。很想就自己做出个小小的系统来。可真要动手,却又茫然而不知所措。为什么会这样呢?因为我们没有耐心去学习基础知识。写根本看不到什么效果的测试代码。

乐观 发表于 2015-1-21 05:38:23

主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。

爱飞 发表于 2015-1-26 20:24:33

在asp.net虚拟主机的服务提供商中,目前首推的是CNNIC的其中一家域名注册机构---时代互联(www.now.net.cn),他们早在2001年微软刚推出Asp.net时就推出了对应的Asp.net虚拟主机了,经笔者的使用测试,他提供的Asp.net性能非常的稳定,版本也会定期的更新,目前他的

只想知道 发表于 2015-2-4 11:50:23

关于ASP.NET功能上,ASP.NET比微软以前的ASP(96年出现)有更强大的library,更好的稳定性。ASP.NET可以使用.NETFramework中所有组件(也就是说.NET能实现的,ASP.NET一样能实现)。

深爱那片海 发表于 2015-2-5 15:53:46

它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。

灵魂腐蚀 发表于 2015-2-9 15:57:49

ASP.Net和ASP的最大区别在于编程思维的转换,而不仅仅在于功能的增强。ASP使用VBS/JS这样的脚本语言混合html来编程,而那些脚本语言属于弱类型、面向结构的编程语言,而非面向对象。

蒙在股里 发表于 2015-2-27 09:36:28

网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项!

小魔女 发表于 2015-2-28 23:18:04

asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源

变相怪杰 发表于 2015-3-4 16:44:50

业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高,你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。

若相依 发表于 2015-3-11 20:27:51

它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。

仓酷云 发表于 2015-3-19 11:31:17

以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。

小女巫 发表于 2015-3-27 19:09:52

主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。
页: [1]
查看完整版本: ASP.NET网页编程之[你必需晓得的.NET]第十七回:同床异梦:覆写和重载仓酷云