版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第二章 接接口接口是面向向对象的的JS程序员员工具箱箱中最有有用的工工具之一一,在四四人组的的设计计模式中中关于可可重用的的面向对对象设计计思想的的第一原原则就说说:面向向接口编编程,而而不要面面向实现现编程。这这告诉你你这个概概念有多多么重要要。但问题是JJS没有内内建的方方式去实实现接口口。它也也没有内内建的方方法去确确定一个个对象实实现了和和另一个个对象相相似的方方法集合合。这造造成了对对象不能能交换使使用。但但所幸JS是一门门扩展性性非常强强的语言言,这使使得它可可以很简简单的增加加这些特特性。这一章,我我们先看看其他语语言是如如何实现现接口的的,然后后来尝试试模仿它它们的精精华。看看
2、下利用用JS如何实实现这些些。当然然,我们们最后会会提出一一个可以以检查对对象是否含含有所需需方法的的可重用用的类。什么是接口口接口提供了了那些方方法是对对象必须须的。它它不指定定如何实实现这些些方法,尽管他他也许包包含(或或暗含)了了方法的的含义,例例如,如如果一个个接口包包含了一一个seetNaame方方法,你你理所当当然的就就会确定定这个方方法的实实现就是是接受一一个字符符串参数数,然后后将其指指定给一一个namme变量。根据对象提提供的特特性来作作为它们们分组的的依据。例例如,如如果一类类看上去去存在很很大差异异的对象象都实现了Coompaarabble接接口,那那它们就就可以交交替使
3、用用到obbjecct.ccompparee(annothherOObjeect)上。这允允许两个个不同的的类之间间建立对对话。将将一个接接受类作作为参数数的函数数可改为为接受一一个接口口作为函函数的参参数,这这就允许许将任何何具体实实现的类类传递进进去。一一些没有有联系的的类被允允许同等等的对待待。使用接口的的好处接口在JSS的面向向对象中中可以做做什么?建立一一个接口口可以起起到自我说明明和提升升重用性性的功效效。接口口告诉程程序员一一个更易易用的类类需要实实现哪些些方法。如如果你熟熟悉一个个接口,你你就已经经知道了了用任何何一个存存在的类类去实现现它,提提升已存存在类可可重用的的机会。接
4、口使得不不同类之之间的沟沟通更加加稳固。提提前知道道接口,你就可以减少集成两个对象时出现的错误。接口允许你提前指定一个类需要有哪些特性和操作。一个程序员因为需要为某个类编写了一个接口,然后把它交给了另外一个程序员。第二个程序员一旦实现了这个接口,那无论用什么方法,这个类都会正常运转。这在大型工程中尤为有效。检测和调试变得更加简单。在类似与JS这样的弱类型语言中,跟踪类型匹配错误非常困难。但使用接口就会让这变得简单一些,因为如果一但某个类没有所期望的类型或者没有实现某个需求的接口,显式的错误就会给出。然后逻辑错误被限制在了它们自己的方法中,而不是对象之间中。接口也保证了你代码的重用性更加稳定,因
5、为所有的类必须随着所实现接口的改动而改动。如果你为某个接口增加了一个操作,而没有为实现这个接口的类增加相应的操作,那错误马上就会出现。使用接口的的缺点。使用接口并并不是没没有缺点点。JS之所以以是一门门非常灵灵活的语语言,在在很大程程度上是是由于它它的弱类类型。使使用接口口就意味味着强类型型,这降降低了JS的灵活活性。JS没有内内建的接接口支持持,模仿仿其他语语言内建建的机制制常常带带来一些些风险。它它没有intterffacee关键字字。所以以你为用用来实现现接口的的方法比比起C+和JAVVA来都显得非非常困难难。在JS中使使用任何何的接口口都会使使性能有有所下降降。因为为部分的的开销要要用
6、来调调用另外外的函数数。我们们的实现现用了两两个for循环来来迭代遍遍历每个个方法到到每个请请求的接接口。对对一些实实现大型型接口或或很多接接口的类类来说,这这种迭代代需要花花费一些些时间并并对系统统性能造造成负面面影响。如如果你担担心这点点,你可可以在开开发完成成后跳过过这一步步,或这这给它一一个调试试标志,以以便其在在产品环环境中不不执行。但必须要保证过早的优化。类似于firebug这样可以帮你检测接口是否被剥离出来的调试工具是非常必须的。最大的缺点点是你无无法使其其他的程程序员严严格遵循循你所编编写的接接口。在在其他语语言中intterffacee是内建建的,如如果程序序员为某某个类实实
7、现了一一个接口口,编译译器就会会检查这这个类是是否真正正的实现现了这个个接口。在JS中,你你必须人人工的确确定给定定的类是是否实现现了一个个接口。你你可以利利用代码码规范和和辅助类类来缓解解这个问问题,但但却无法法完全解解决。如如果其他他程序员员和你共共同做一一个项目目而无视视你的借借口,那那你也没没办法强强迫他们们。接口在其他他面向对对象语言言中的应应用我们简短看看一下三三种常用用的面向向对象语语言是如如何处理理接口的的,你会会发现他他们之间间非常类类似。我我们再“接口类”这一节节中创建建intterffacee类时,会会尽可能能的模仿仿这些机机制。JAVA使使用了一一种典型型的方法来实现现
8、接口,我我们先从从它开始始。这是javva.iio包中中的一个个接口publiic iinteerfaace DattaOuutpuut void wriiteBBoolleann(boooleean vallue) thhrowws IIOExxcepptioon;void wriiteBBytee(innt vvaluue) thrrowss IOOExccepttionn;void wriiteCCharr(innt vvaluue) thrrowss IOOExccepttionn;void wriiteSShorrt(iint vallue) thhrowws IIOExxceppt
9、ioon;void wriiteIInt(intt vaaluee) tthroows IOEExceeptiion;.这是一个类类所必须须实现的的方法列列表,与与参数和和异常联联系到一一起,每每一行都都是看起起来很相相似的方方法声明明,异常常后面是是分号,而而不是一一对大括括号。创建一个使使用这个个借口的的类,需需要impllemeentss关键字字publiic cclasss DDataaOuttputtStrreamm exxtennds FillterrOuttputtStrreamm immpleemennts DattaOuutpuut publiic ffinaal vvoid
10、d wrriteeBoooleaan (bboolleann vaaluee) tthroows IOEExceeptiion writee (vvaluue ? 1 : 00);.每一个接口口中列出出的方法法都被声声明和实实现,如如果某个个方法没没有被实实现,错错误就会会在编译译的时候候显示,类类似如下下MyClaass shoouldd bee deeclaaredd abbstrractt; iit ddoess noot ddefiine wriiteBBoolleann(boooleean) inn MyyClaass.PHP使用用了相同同的语法法:interrfacce MMyIn
11、nterrfacce publiic funnctiion intterffaceeMetthodd($aarguumenntOnne, $arrgummenttTwoo);classs MyyClaass impplemmentts MMyInnterrfacce publiic ffuncctioon iinteerfaaceMMethhod($arrgummenttOnee, $arggumeentTTwo) returrn $arggumeentOOne . $argguemmntTTwo;classs BaadCllasss immpleemennts MyIInteerfaace
12、/ Noo meethood ddecllaratiionss./ BaadCllasss caausees tthiss errrorr att ruun-ttimee:/ Faatall errrorr: CClasss BBadCClasss cconttainns 11 abbstrractt meethoods andd muust theerefforee bee / deeclaaredd abbstrractt (MMyInnterrfacce:intterffaceeMetthodd)还有C#interrfacce MMyInnterrfacce strinng iintee
13、rfaaceMMethhod(strringg arrgummenttOnee, sstriing arggumeentTTwo);classs MyyClaass : MMyInnterrfacce publiic sstriing intterffaceeMetthodd(sttrinng aarguumenntOnne, strringg arrgummenttTwoo) returrn aarguumenntOnne + arrgummenttTwoo;classs BaadCllasss : MyIInteerfaace / Noo meethood ddecllaraatioons
14、./ BaadCllasss caausees tthiss errrorr att coompiile-timme:/ BaadCllasss dooes nott immpleemennt iinteerfaace memmberr MyyIntterffacee.innterrfacceMeethood()所有这些语语言都大大体上使使用了相相同的方方法。一一个接口口包含了了那些方方法需要要被实现现,以及及这些方方法需要要的参数数。在类类中,先先是声明明了它要要实现哪哪个接口口,通常常是使用用impplemmentts关键字字。每个个类都可可以实现现不止一一个接口口。如果果接口中中的哪个个
15、方法没没有被实实现,错错误就会会抛出。根根据语言言的不同同,这会会在编译译或者运运行时发发生。错错误信息息告诉用用户三件件事:类类名,接接口名,未未被实现现的方法法名。很明显,我我们不能能用同样样的途径径实现借借口,因因为JS中没有intterffacee和impplemmentts关键字字。因此此不能在在运行时时检查是是否遵循循接口。然然而,使使用辅助助类和显显式的遵遵从性检检查以模模拟接口口的大部部分特性性确实可可能的。在JS中模模拟接口口我们将讨论论在JS中模拟拟接口的的三种方方法:注注释,属属性检查查和鸭子子类型,没没有哪种种方案是是完美的的,但结结合这三三种方法法就会趋趋于完美美。用
16、注释描述述接口最简单也是是效果最最差的接接口模拟拟是使用用注释。模模仿其他他面向对对象语言言的方式式,在注注释中使使用intterffacee和impplemmentts关键字字。这无无法检测测语法错错误,这这有一个个例子显显示了关关键字如如何被添添加到代代码中以以起到说说明的作作用。/*interrfacce CCompposiite functtionn addd(cchilld);functtionn reemovve(cchilld);functtionn geetChhildd(inndexx);interrfacce FFormmIteem functtionn saave();*
17、/var CCompposiiteFFormm = funnctiion(id, meethood, acttionn) / immpleemennts Commpossitee, FFormmIteem.;/ Immpleemennt tthe Commpossitee innterrfacce.CompoositteFotottypee.addd = fuuncttionn(chhildd) .;CompoositteFotottypee.reemovve = fuuncttionn(chhildd) .;CompoositteFotottypee.geetChhildd = funnct
18、iion(inddex) .;/ Immpleemennt tthe ForrmIttem intterffacee.CompoositteFotottypee.saave = ffuncctioon() .;这并没有很很好的模模拟接口口的功能能,他没没有检查查以确保保commpossiteeForrm确实实实现了正正确地方方法集合合。也没没有抛出出错误以以通知程程序员问问题所在在,除了了说明外外它没有有起到任任何作用用。所有有的一致致性都要要靠程序序员完全全自发完完成。然而,这种种方法也也有一些些优点,它它容易实实现,不不需要额额外的类类或函数数。提升升了可重重用性,因因为类有有了接口口说明
19、并并且可以以跟其他他实现了了相同接接口的类类交换。它它不影响响文档的的大小和和执行速速度。当当代码展展开式,这这些注释释可以被被轻易的的剥离。避避免了因因使用接接口而造造成文件件大小的的增加。但但是,由由于无法法给出错错误。他他不能帮帮助检查查和调试试代码。用属性检查查模拟接接口第二种方法法就要严严格一些些了,所所有类显显示声明明了所要要实现的的接口,这这些声明明被想要要与这些些类结合合的对象象检查,接接口依然然仅仅是是个注释释,但是是你现在在可可以以检查一一个属性性,看它它的类“自称”实现了了一个什什么接口口。/*interrfacce CCompposiite functtionn add
20、d(cchilld);functtionn reemovve(cchilld);functtionn geetChhildd(inndexx);interrfacce FFormmIteem functtionn saave();*/var CCompposiiteFFormm = funnctiion(id, meethood, acttionn) this.impplemmenttsInnterrfacces = Coompoositte, FFormmIteem;.;.functtionn adddFoorm(forrmInnstaancee) if(!iimpllemeentss(fo
21、ormIInsttancce, Coompoositte, FFormmIteem) throww neew EErroor(Objjectt dooes nott immpleemennt aareqquirred intterffacee.);./ Thhe iimpllemeentss fuuncttionn, wwhicch ccheccks to seee iff ann obbjecct ddecllarees tthatt itt / immpleemennts thee reequiiredd innterrfacces.functtionn immpleemennts(obj
22、jectt) for(vvar i = 1; i aarguumennts.lenngthh; ii+) / Looopinng tthrooughh alll aarguumennts / affterr thhe ffirsst oone.var iinteerfaaceNNamee = arggumeentssi;var iinteerfaaceFFounnd = faalsee;for(vvar j = 0; j oobjeect.impplemmenttsInnterrfacces.lenngthh; jj+) if(obbjecct.iimpllemeentssIntterffac
23、eesjj = iinteerfaaceNNamee) interrfacceFooundd = truue;breakk;if(!iinteerfaaceFFounnd) returrn ffalsse; / An intterffacee waas nnot fouund. returrn ttruee; / AAll intterffacees wweree fooundd.在这个例子子中,CommpossiteeForrm声明了了它要实实现两个个接口,Commpossitee和ForrmIttem,这是是通过把把接口们们的名称称添加到到一个数数组中实实现的,数数组标记记为impplem
24、menttIntterffacees。这个个类显示示声明了了它将支支持那个个类。任任何一个个使用确确定的类类型作为为参数的的函数都都可以检检查其属属性,如如果所要要求的接接口没有有被实现现,就会会抛出一一个错误误。这种方法的的优点在在于,你你说明了了一个类类实现了了哪些接接口,如如果一个个没有声声明它需需要实现现的某个个接口,就就会出现现错误。你你可以利利用这些些错误强强迫其它它程序员员声明这这些接口口。然而它的缺缺点在于于你无法法确定类类是否真真正实现现了这个个接口,你你仅知道道它“自称”实现了了接口。创创建一个个声明了了却忘了了实现接接口的类类是非常常容易的的,所有有的检测测都会通通过,但
25、但没有实实现方法法,这就就造成了了潜在的的问题。当当然,显显示的声声明类所所要支持持的接口口无疑也也增加了了工作两两。用鸭子类型型模拟接接口事实上,一一个类是是否声明明了它所所支持的的接口是是无关紧紧要的,只只需要函函数出现现在正确确的地方方。这就就是使用用鸭子类类型的合合适地方方。鸭子子类型的的意思是是:“如果它它走路像像鸭子,叫叫起来也也像鸭子子,那它它就是鸭鸭子”。这个技技巧判断断对象是是否为一一个类的的实例完完全基于于它实现现了什么么方法。这这种方法法的含义义非常简简单,如如果一个个对象中中包含的的方法和和这个对对象所要要实现的的接口中中包含的的方法具具有相同同的名称称,那么么它就实实
26、现了这这个方法法。利用用辅助函函数,你你可以确确定它是是否包含含相应的的函数。/ Innterrfacces.var CCompposiite = nnew Intterffacee(CCompposiite, addd, rremoove, gettChiild);var FFormmIteem = neew IInteerfaace(FoormIItemm, ssavee);/ CoompoositteFoorm claassvar CCompposiiteFFormm = funnctiion(id, meethood, acttionn) .;.functtionn adddFoorm
27、(forrmInnstaancee) ensurreImmpleemennts(forrmInnstaancee, CCompposiite, FoormIItemm);/ Thhis funnctiion willl tthroow aan eerroor iif aareqquirred metthodd iss noot iimpllemeenteed.这种方法区区别与前前两种方方法在于于它没有有注释。所所有的特特性都是是具有强强制力。enssureeImpplemmentt函数需需要至少少两个参参数,第第一个参参数是需需要检测测的对象象,剩下下的参数数是这个个对象需需要比较较的接口口。
28、这个个函数检检测了第第一个参参数传递递进来的的对象是是否实现现了接口口中生命命的方法法。如果果没有,则则包含相相关信息息的错误误就会被被抛出。信信息中包包含了类类名,接接口名,以以及没有有被正确确实现的的方法名名。这个个函数可可以被放放置在任任何需要要的地方方。在这这个例子子中,你你仅需在在它实现现所需方方法的情情况下利利用adddForrm添加表表单。这是三种方方法中最最有效的的,但它它仍然有有一些缺缺点,一一个类从从不声明明它实现现了哪谢谢方法。这这就降低低了代码码的可重重用性。它它也没有有像其他他方法一一样有说说明。它它还需要要一个辅辅助类inteerfaace和一个个辅助函函数enss
29、ureeImpplemmentt。它没没有检查查方法的的参数数数量和名名称。也也没有类类型检查查,紧紧紧是检测测对象是是否有正正确地方方法名。本书中的接接口实现现在本书中,我我们综合合了第一一种方法法和第三三种方法法,用注注释来声声明一个个类需要要支持哪哪些接口口,这提提升了类类的可重重用性并并有了说说明文档档。我们们用Intterffacee辅助类类和Intterffacee.ennsurreImmpleemennt辅助函函数来执执行显示示检查。当当对象没没有通过过检查,就就会返回回一个相相关的错错误信息息。这是Intterffacee类和注注释相结结合的例例子:/ Innterrfacce
30、s.var CCompposiite = nnew Intterffacee(CCompposiite, addd, rremoove, gettChiild);var FFormmIteem = neew IInteerfaace(FoormIItemm, ssavee);/ CoompoositteFoorm claassvar CCompposiiteFFormm = funnctiion(id, meethood, acttionn) / immpleemennts Commpossitee, FFormmIteem.;.functtionn adddFoorm(forrmInnsta
31、ancee) Interrfacce.eensuureIImpllemeentss(foormIInsttancce, Commpossitee, FFormmIteem);/ Thhis funnctiion willl tthroow aan eerroor iif aareqquirred metthodd iss noot iimpllemeenteed,/ haaltiing exeecuttionn off thhe ffuncctioon./ Alll ccodee beeneaath thiis llinee wiill be exeecutted onlly iif tthe
32、 cheeckss paass.Interrfacce.eensuureIImpllemeentss提供了了更严格格的检查查,如果果有问题题出现,就就会有异异常抛出出,异常常可以被被扑捉并并处理,或或者停止止执行代代码。总总之,程程序员会会立即知知道问题题出现并并加以处处理。接口类下面就是我我们在本本书中使使用的Intterffacee类/ Coonsttrucctorr.var IInteerfaace = ffuncctioon(nnamee, mmethhodss) if(arrgummentts.llenggth != 2) throww neew EErroor(Intterffac
33、ee coonsttrucctorr caalleed wwithh + aarguumennts.lenngthh +arguumennts, buut eexpeecteed eexacctlyy 2.);this.namme = naame;this.metthodds = ;for(vvar i = 0, leen = meethoods.lenngthh; ii lenn; ii+) if(tyypeoof mmethhodssi != strringg) throww neew EErroor(Intterffacee coonsttrucctorr exxpeccts metth
34、odd naamess too bee + paasseed iin aas aastrringg.);this.metthodds.ppushh(meethoodsi); ; / Sttatiic cclasss mmethhod.Interrfacce.eensuureIImpllemeentss = funnctiion(objjectt) if(arrgummentts.llenggth 22) throww neew EErroor(Funnctiion Intterffacee.ennsurreImmpleemennts callledd wiith + argummentts.l
35、lenggth + arrgummentts, butt exxpecctedd att leeastt 2.);for(vvar i = 1, leen = arrgummentts.llenggth; i llen; i+) var iinteerfaace = aarguumenntsi;if(innterrfacce.cconsstruuctoor != Intterffacee) throww neew EErroor(Funnctiion Intterffacee.ennsurreImmpleemennts exppectts aarguumennts+ twwo aand abo
36、ove to be insstanncess off Innterrfacce.);for(vvar j = 0, meethoodsLLen = iinteerfaace.metthodds.llenggth; j mmethhodssLenn; jj+) var mmethhod = iinteerfaace.metthoddsjj;if(!oobjeectmetthodd | ttypeeof objjecttmeethood != ffuncctioon) throww neew EErroor(Funnctiion Intterffacee.ennsurreImmpleemennts
37、: obbjecct + dooes nott immpleemennt tthe + innterrfacce.nnamee + iinteerfaace. Meethood + metthodd + wwas nott fooundd.); ;什么时候使使用接口口类严格的类型型检查并并非总是是必须,许许多JS程序员员经年也也不曾使使用一个个接口或或着类型型检查。但但是当你你使用接接口去完完成一个个复杂的的系统时时,这会会变得非非常重要要。接口口看上去去似乎降降低了JS的灵活活性,但但实际上上灵活性性反而得得到了提提高,因因为类之之间的耦耦合变得得更加松松散。函函数也变变得更加加灵活,因因为
38、在你你为函数数传递进进任何类类型的参参数后,依依然能使使正确地地对象使使用正确确的方法法,下面面几中情情形中接接口非常常有用在多名程序序员合作作的大型型工程中中,接口口是必需需的,通通常程序序员所需需要的API还没有有写完,或或者需要要提供占占位程序序以保证证工程的的正常进进度。接接口在这这种情况况下变得得非常有有价值。它它们说明明了可用用于两个个程序员员之间沟沟通的API,当占占位程序序被正式式的API所替代代时。你你立即就就会知道道你所需需要的方方法是否否会被实实现。如如果API在中期期开发中中改变,另另外一个个程序员员也可以以实现相相同的接接口来无无缝的替替代。包含来自互互联网的的那些没
39、没有控制制权的代代码越来来越普遍遍,外部部主机库库是其中中的一个个例子,如如搜索,电电邮和地地图这样样的服务务API,尽管管它们的的来源可可靠,也也要注意意确保它它们的改改变不要要导致代代码错误误。解决决途径之之一是为为你以来来的这些些API创建Intterffacee对象,然然后检测测每个对对象是否否正确的的实现了了它们的的接口。var DDynaamiccMapp = neww Innterrfacce(DynnamiicMaap, cennterrOnPPoinnt, zzoomm, drraw);functtionn diispllayRRoutte(mmapIInsttancce)
40、Interrfacce.eensuureIImpllemeentss(maapInnstaace, DyynammicMMap);mapInnstaancee.ceenteerOnnPoiint(12, 344);mapInnstaancee.zooom(5);mapInnstaancee.drraw();.在这个例子子中,dissplaayRooutee函数需要要传递进进来的参参数对象象拥有三三个指定定的方法法,使用用Intterffacee对象并并调用Intterffacee.ennsurreImmpleemennt方法就就可以确确定这三三个方法法是否被被实现,如如果没有有则出现现错误。错
41、错误可以以被一个个tryy/caatchh语句扑扑捉到,然然后在后后台利用用AJAAX请求提提醒你这这个外部部API的错误误。这可可以使你你的Maash-upss(指通过过多源头头信息整整合,轻轻松创建建一项新新服务)变变得更加加健壮和和隐秘。如何使用接接口类最重要的一一步(也也是最难难执行的的一步)是是确定在在你的代代码中是是否值得得使用接接口。难难度简单单的项目目也许从从接口那那里得不不到什么么好处。你你得自己己权衡利利弊。假假如用了了,下面面提供如如何使用用接口的的方法:在HTMLL文件中中包含Intterffacee类。Intterffacee.jss文件可可以在网网站htttp:/j
42、jsdeesiggnpaatteernss.coom/获获取。遍历并找到到找到你你的代码码中用对对象做参参数的函函数。找找出这些些对象需需要那些些方法才才能使你你的代码码正常工工作为每个方法法集合谨谨慎的创创建接口口移除所有显显示的结结构体检检查。因因为我们们用了鸭鸭子类型型,对象象的类型型已经无无关紧要要。用Inteerfaace.enssureeImpplemmentt替换结结构体检检查。你从这里面面得到了了什么?你的代代码变得得更加松松耦合因因为你不不再依赖赖任何类类的实例例。相反反的你所所需要的的特性在在合适的的地方,任任何具体体的实现现都会被被使用。给给你更多多的自由由去优化化和重构
43、构你的代代码。实例:使用用接口类类想象一下你你创建了了一个类类,用来来自动检检测结果果并格式式化输出出为一个个网页视视图。这这个类的的构造函函数用了了一个TTesttRessultt类的实实例作为为参数。然然后他将将数据压压缩后传传入TesstReesullt对象并并将其传传递给请请求。这这便是RResuultFFormmattter最最初的样样子。/ ReesulltFoormaatteer cclasss, befforee wee immpleemennt iinteerfaace cheeckiing.var RResuultFFormmattter = ffuncctioon(rre
44、suultssObjjectt) if(!(ressulttsObbjecct iinsttancceOff TeestRResuult) throww neew EErroor(RessulttsFoormaatteer: connstrructtor reqquirres an insstannce + off TeestRResuult as an arggumeent.);this.ressulttsObbjecct = reesulltsOObjeect;ResulltFoormaatteer.pprottotyype.rennderrRessultts = fuuncttionn(
45、) var ddateeOfTTestt = thiis.rresuultssObjjectt.geetDaate();var rresuultssArrray = tthiss.reesulltsOObjeect.gettRessultts();var rresuultssConntaiinerr = doccumeent.creeateeEleemennt(divv);var rresuultssHeaaderr = doccumeent.creeateeEleemennt(h3);resulltsHHeadder.innnerHHTMLL = Teest Ressultts ffromm
46、 + ddateeOfTTestt.tooUTCCStrringg();resulltsCConttainner.apppenddChiild(ressulttsHeeadeer);var rresuultssLisst = doocummentt.crreatteEllemeent(ull);resulltsCConttainner.apppenddChiild(ressulttsLiist);for(vvar i = 0, leen = reesulltsAArraay.llenggth; i llen; i+) var llisttIteem = doocummentt.crreatte
47、Ellemeent(lii);listIItemm.innnerrHTMML = reesulltsAArraayii;resulltsLListt.apppenndChhildd(liistIItemm);returrn rresuultssConntaiinerr;这个类在构构造函数数中执行行了一个个检查以以保证参参数确实实为TesstReesullt的实例例;如果果不是,抛抛出异常常。这可可以让你你代码中中的reendeerReesullts方方法知道道gettDatte方法法和geetReesullts方方法是可可用的。是是这样吗吗,在构构造函数数中,你你仅仅检检查了rresuults
48、sObjjectt 是TesstReesullt的实例例。这并并不能保保证你所所需要的的方法被被实现了了。TeestRResuult可可以被修修改并不不再拥有有一个ggetDDatee方法。这这个检查查会通过过,但rrendderRResuultss就会失失效。结构体中的的检查还还有不必必要的限限制。它它禁止了了其它类类的实例例作为参参数,即即使它们们能很好好的运行行。例如如你有一一个WeeathherDDataa类。它它有geetDaate和和gettRessultts方法法并可以以在ReesulltFoormaatteer中运运行而没没有任何何问题。但但是用显显示的类类型检查查(用iinsttancceOff操作符)就就会禁止止WeaatheerDaata的的任何实实例。解解决办法法是移除除insstannceOOf检查查并用接接口代替替。第一一步是创创建接口口本身:/ ReesulltSeet I
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年江西科技职业学院单招综合素质考试备考试题带答案解析
- 2026年山东中医药高等专科学校高职单招职业适应性测试模拟试题有答案解析
- 2026年铜仁幼儿师范高等专科学校单招综合素质考试参考题库带答案解析
- 2026年浙江纺织服装职业技术学院单招综合素质考试参考题库带答案解析
- 2026年滴滴出行路径规划与ETA预估算法测试含答案
- 2026年通信维修工上岗证考试题库及答案
- 2026年乡村医生面试经典题型分析含答案
- 2026年南通职业大学高职单招职业适应性测试备考题库有答案解析
- 2026年皖西卫生职业学院单招综合素质笔试模拟试题带答案解析
- 2026年四川电焊考试题库含答案
- 2025年11月5日更新的REACH第35批251项高度关注物质SVHC清单
- 2023年和田地区直遴选考试真题汇编附答案解析
- 《5G无线网络规划部署》课件-17、5G RF优化流程
- 屋顶彩钢瓦施工安装合同
- 设备管理安全风险辨识
- 中央管理企业负责人薪酬制度改革方案
- 3.提高多标高深基坑支护施工验收一次合格率-飞扬QC小组
- 数据中心智能化系统设备部署方案
- 专项突破:平面直角坐标系中面积、规律、新定义、几何综合问题(解析版)
- 化学剥脱美容技术
- 医疗机构传染病隔离区域设置与管理要求
评论
0/150
提交评论