JavaScript设计模式之接口_第1页
JavaScript设计模式之接口_第2页
JavaScript设计模式之接口_第3页
JavaScript设计模式之接口_第4页
JavaScript设计模式之接口_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第二章接接口接口是面面向对象象的JS程序员员工具箱箱中最有有用的工工具之一一,在四四人组的的设计计模式中关于于可重用用的面向对对象设计计思想的的第一原原则就说说:面向向接口编编程,而而不要面面向实现现编程。这告诉诉你这个个概念有有多么重重要。但问题是是JS没有内内建的方方式去实实现接口口。它也也没有内内建的方方法去确确定一个个对象实实现了和和另一个个对象相相似的方方法集合合。这造造成了对对象不能能交换使使用。但但所幸JS是一门门扩展性性非常强强的语言言,这使使得它可可以很简简单的增加加这些特特性。这一章,我们先先看其他他语言是是如何实实现接口口的,然然后来尝尝试模仿仿它们的的精华。看下利利用J

2、S如何实实现这些些。当然然,我们们最后会会提出一一个可以以检查对对象是否含含有所需需方法的的可重用用的类。什么是接接口接口提供供了那些些方法是是对象必必须的。它不指指定如何何实现这这些方法法,尽管他他也许包包含(或或暗含)了方法法的含义义,例如如,如果果一个接接口包含含了一个个settNamme方法法,你理理所当然然的就会会确定这这个方法法的实现现就是接接受一个个字符串串参数,然后将将其指定定给一个个namme变量。根据对象象提供的的特性来来作为它它们分组组的依据据。例如如,如果果一类看看上去存存在很大大差异的的对象都都实现了Coompaarabble接接口,那那它们就就可以交交替使用用到ob

3、bjecct.ccompparee(annothherOObjeect)上。这允允许两个个不同的的类之间间建立对对话。将将一个接接受类作作为参数数的函数数可改为为接受一一个接口口作为函函数的参参数,这这就允许许将任何何具体实实现的类类传递进进去。一一些没有有联系的的类被允允许同等等的对待待。使用接口口的好处处接口在JJS的面向向对象中中可以做做什么?建立一一个接口口可以起起到自我说明明和提升升重用性性的功效效。接口口告诉程程序员一一个更易易用的类类需要实实现哪些些方法。如果你你熟悉一一个接口口,你就就已经知知道了用用任何一一个存在在的类去去实现它它,提升升已存在在类可重重用的机机会。接口使得得

4、不同类类之间的的沟通更更加稳固固。提前前知道接接口,你你就可以以减少集集成两个个对象时时出现的的错误。接口允允许你提提前指定定一个类类需要有有哪些特特性和操操作。一一个程序序员因为为需要为为某个类类编写了了一个接接口,然然后把它它交给了了另外一一个程序序员。第第二个程程序员一一旦实现现了这个个接口,那无论论用什么么方法,这个类类都会正正常运转转。这在在大型工工程中尤尤为有效效。检测测和调试试变得更更加简单单。在类类似与JS这样的的弱类型型语言中中,跟踪踪类型匹匹配错误误非常困困难。但但使用接接口就会会让这变变得简单单一些,因为如如果一但但某个类类没有所所期望的的类型或或者没有有实现某某个需求求

5、的接口口,显式式的错误误就会给给出。然然后逻辑辑错误被被限制在了它它们自己己的方法法中,而而不是对对象之间间中。接接口也保保证了你你代码的的重用性性更加稳稳定,因因为所有有的类必必须随着着所实现现接口的的改动而而改动。如果你你为某个个接口增增加了一一个操作作,而没没有为实实现这个个接口的的类增加加相应的的操作,那错误误马上就就会出现现。使用接口口的缺点点。使用接口口并不是是没有缺缺点。JS之所以以是一门门非常灵灵活的语语言,在在很大程程度上是是由于它它的弱类类型。使使用接口口就意味味着强类型型,这降降低了JS的灵活活性。JS没有有内建的的接口支支持,模模仿其他他语言内内建的机机制常常常带来一一

6、些风险险。它没没有intterffacee关键字字。所以以你为用用来实现现接口的的方法比比起C+和JAVVA来都显得非非常困难难。在JS中中使用任任何的接接口都会会使性能能有所下下降。因因为部分分的开销销要用来来调用另另外的函函数。我我们的实实现用了了两个for循环来来迭代遍遍历每个个方法到到每个请请求的接接口。对对一些实实现大型型接口或或很多接接口的类类来说,这种迭迭代需要要花费一一些时间间并对系系统性能能造成负负面影响响。如果果你担心心这点,你可以以在开发发完成后后跳过这这一步,或这给给它一个个调试标标志,以以便其在在产品环环境中不不执行。但必须须要保证证过早的的优化。类似于于firreb

7、uug这样可可以帮你你检测接接口是否否被剥离离出来的的调试工工具是非非常必须须的。最大的缺缺点是你你无法使使其他的的程序员员严格遵遵循你所所编写的的接口。在其他他语言中中intterffacee是内建建的,如如果程序序员为某某个类实实现了一一个接口口,编译译器就会会检查这这个类是是否真正正的实现现了这个个接口。在JS中,你你必须人人工的确确定给定定的类是是否实现现了一个个接口。你可以以利用代代码规范范和辅助助类来缓缓解这个个问题,但却无无法完全全解决。如果其其他程序序员和你你共同做做一个项项目而无无视你的的借口,那你也也没办法法强迫他他们。接口在其其他面向向对象语语言中的的应用我们简短短看一下

8、下三种常常用的面面向对象象语言是是如何处处理接口口的,你你会发现现他们之之间非常常类似。我们再再“接口类”这一节节中创建建intterffacee类时,会尽可可能的模模仿这些些机制。JAVAA使用了了一种典典型的方方法来实现现接口,我们先先从它开开始。这是jaava.io包包中的一一个接口口publlic intterffacee DaataOOutpput voidd wrriteeBoooleaan(bboolleann vaaluee) tthroows IOEExceeptiion;voidd wrriteeBytte(iint vallue) thhrowws IIOExxceppt

9、ioon;voidd wrriteeChaar(iint vallue) thhrowws IIOExxcepptioon;voidd wrriteeShoort(intt vaaluee) tthroows IOEExceeptiion;voidd wrriteeIntt(innt vvaluue) thrrowss IOOExccepttionn;.这是一个个类所必必须实现现的方法法列表,与参数数和异常常联系到到一起,每一行行都是看看起来很很相似的的方法声声明,异异常后面面是分号号,而不不是一对对大括号号。创建一个个使用这这个借口口的类,需要impllemeentss关键字字publlic

10、 claass DattaOuutpuutSttreaam eexteendss FiilteerOuutpuutSttreaam iimpllemeentss DaataOOutpput publlic finnal voiid wwritteBoooleean (bboolleann vaaluee) tthroows IOEExceeptiion writte (vallue ? 11 : 0);.每一个接接口中列列出的方方法都被被声明和和实现,如果某某个方法法没有被被实现,错误就就会在编编译的时时候显示示,类似似如下MyCllasss shhoulld bbe ddecllareed

11、aabsttracct; it doees nnot deffinee wrriteeBoooleaan(bboolleann) iin MMyCllasss.PHP使使用了相相同的语语法:inteerfaace MyIInteerfaace publlicffuncctioon iinteerfaaceMMethhod($arrgummenttOnee, $arggumeentTTwo);classs MMyCllasss immpleemennts MyIInteerfaace publlic funnctiion intterffaceeMetthodd($aarguumenntOnne

12、, $arrgummenttTwoo) retuurn $arrgummenttOnee . $arrgueemnttTwoo;classs BBadCClasss iimpllemeentss MyyIntterffacee / NNo mmethhod decclarratiionss./ BBadCClasss ccausses thiis eerroor aat rrun-timme:/ FFataal eerroor: Claass BaddClaass conntaiins 1 aabsttracct mmethhodss annd mmustt thhereeforre bbe

13、/ ddecllareed aabsttracct (MyIInteerfaace:innterrfacceMeethood)还有C#inteerfaace MyIInteerfaace striing intterffaceeMetthodd(sttrinng aarguumenntOnne, strringg arrgummenttTwoo);classs MMyCllasss : MyIInteerfaace publlic strringg innterrfacceMeethood(sstriing arggumeentOOne, sttrinng aarguumenntTwwo) r

14、etuurn arggumeentOOne + aarguumenntTwwo;classs BBadCClasss : MyyIntterffacee / NNo mmethhod decclarratiionss./ BBadCClasss ccausses thiis eerroor aat ccomppilee-tiime:/ BBadCClasss ddoess noot iimpllemeent intterffacee meembeer MMyInnterrfacce.iinteerfaaceMMethhod()所有这些些语言都都大体上上使用了了相同的的方法。一个接接口包含含了那

15、些些方法需需要被实实现,以以及这些些方法需需要的参参数。在在类中,先是声声明了它它要实现现哪个接接口,通通常是使使用impplemmentts关键字字。每个个类都可可以实现现不止一一个接口口。如果果接口中中的哪个个方法没没有被实实现,错错误就会会抛出。根据语语言的不不同,这这会在编编译或者者运行时时发生。错误信信息告诉诉用户三三件事:类名,接口名名,未被被实现的的方法名名。很明显,我们不不能用同同样的途途径实现现借口,因为JS中没有intterffacee和impplemmentts关键字字。因此此不能在在运行时时检查是是否遵循循接口。然而,使用辅辅助类和和显式的的遵从性性检查以以模拟接接口的

16、大大部分特特性确实实可能的的。在JS中中模拟接接口我们将讨讨论在JS中模拟拟接口的的三种方方法:注注释,属属性检查查和鸭子子类型,没有哪哪种方案案是完美美的,但但结合这这三种方方法就会会趋于完完美。用注释描描述接口口最简单也也是效果果最差的的接口模模拟是使使用注释释。模仿仿其他面面向对象象语言的的方式,在注释释中使用用intterffacee和impplemmentts关键字字。这无无法检测测语法错错误,这这有一个个例子显显示了关关键字如如何被添添加到代代码中以以起到说说明的作作用。/*inteerfaace Commpossitee funcctioon aadd(chiild);funcc

17、tioon rremoove(chiild);funcctioon ggetCChilld(iindeex);inteerfaace ForrmIttem funcctioon ssavee();*/var CommpossiteeForrm = fuuncttionn(idd, mmethhod, acctioon) / iimpllemeentss Coompoositte, ForrmIttem.;/ IImpllemeent thee Coompoositte iinteerfaace.CompposiiteFFormm.prrotootyppe.aadd = ffuncctioon(

18、cchilld) .;CompposiiteFFormm.prrotootyppe.rremoove = ffuncctioon(cchilld) .;CompposiiteFFormm.prrotootyppe.ggetCChilld = fuuncttionn(inndexx) .;/ IImpllemeent thee FoormIItemm innterrfacce.CompposiiteFFormm.prrotootyppe.ssavee = funnctiion() .;这并没有有很好的的模拟接接口的功功能,他他没有检检查以确确保commpossiteeForrm确实实实现了正正确

19、地方方法集合合。也没没有抛出出错误以以通知程程序员问问题所在在,除了了说明外外它没有有起到任任何作用用。所有有的一致致性都要要靠程序序员完全全自发完完成。然而,这这种方法法也有一一些优点点,它容容易实现现,不需需要额外外的类或或函数。提升了了可重用用性,因因为类有有了接口口说明并并且可以以跟其他他实现了了相同接接口的类类交换。它不影影响文档档的大小小和执行行速度。当代码码展开式式,这些些注释可可以被轻轻易的剥剥离。避避免了因因使用接接口而造造成文件件大小的的增加。但是,由于无无法给出出错误。他不能能帮助检检查和调调试代码码。用属性检检查模拟拟接口第二种方方法就要要严格一一些了,所有类类显示声声

20、明了所所要实现现的接口口,这些些声明被被想要与与这些类类结合的的对象检检查,接接口依然然仅仅是是个注释释,但是是你现在在可可以以检查一一个属性性,看它它的类“自称”实现了了一个什什么接口口。/*inteerfaace Commpossitee funcctioon aadd(chiild);funcctioon rremoove(chiild);funcctioon ggetCChilld(iindeex);inteerfaace ForrmIttem funcctioon ssavee();*/var CommpossiteeForrm = fuuncttionn(idd, mmethhod

21、, acctioon) thiss.immpleemenntsIInteerfaacess = CCompposiite, ForrmIttem;.;.funcctioon aaddFFormm(foormIInsttancce) if(!impplemmentts(fformmInsstannce, CCompposiite, ForrmIttem) throow nnew Errror(Obbjecct ddoess noot iimpllemeent areequiiredd innterrfacce.);./ TThe impplemmentts ffuncctioon, whiich

22、 cheeckss too seee iif aan oobjeect decclarres thaat iit / iimpllemeentss thhe rrequuireed iinteerfaacess.funcctioon iimpllemeentss(obbjecct) for(varr i = 11; ii arggumeentss.leengtth; i+) / Looopiing thrrouggh aall arggumeentss / aafteer tthe firrst onee.var intterffaceeNamme = arrgummenttsii;var i

23、ntterffaceeFouund = ffalsse;for(varr j = 00; jj objjectt.immpleemenntsIInteerfaacess.leengtth; j+) if(oobjeect.impplemmenttsInnterrfaccesj = intterffaceeNamme) inteerfaaceFFounnd = trrue;breaak;if(!intterffaceeFouund) retuurn fallse; / Ann innterrfacce wwas nott fooundd. retuurn truue; / Alll innter

24、rfacces werre ffounnd.在这个例例子中,CommpossiteeForrm声明了了它要实实现两个个接口,Commpossitee和ForrmIttem,这是是通过把把接口们们的名称称添加到到一个数数组中实实现的,数组标标记为impplemmenttIntterffacees。这个个类显示示声明了了它将支支持那个个类。任任何一个个使用确确定的类类型作为为参数的的函数都都可以检检查其属属性,如如果所要要求的接接口没有有被实现现,就会会抛出一一个错误误。这种方法法的优点点在于,你说明明了一个个类实现现了哪些些接口,如果一一个没有有声明它它需要实实现的某某个接口口,就会会出现错错误

25、。你你可以利利用这些些错误强强迫其它它程序员员声明这这些接口口。然而它的的缺点在在于你无无法确定定类是否否真正实实现了这这个接口口,你仅仅知道它它“自称”实现了了接口。创建一一个声明明了却忘忘了实现现接口的的类是非非常容易易的,所所有的检检测都会会通过,但没有有实现方方法,这这就造成成了潜在在的问题题。当然然,显示示的声明明类所要要支持的的接口无无疑也增增加了工工作两。用鸭子类类型模拟拟接口事实上,一个类类是否声声明了它它所支持持的接口口是无关关紧要的的,只需需要函数数出现在在正确的的地方。这就是是使用鸭鸭子类型型的合适适地方。鸭子类类型的意意思是:“如果它它走路像像鸭子,叫起来来也像鸭鸭子,

26、那那它就是是鸭子”。这个技技巧判断断对象是是否为一一个类的的实例完完全基于于它实现现了什么么方法。这种方方法的含含义非常常简单,如果一一个对象象中包含含的方法法和这个个对象所所要实现现的接口口中包含含的方法法具有相相同的名名称,那那么它就就实现了了这个方方法。利利用辅助助函数,你可以以确定它它是否包包含相应应的函数数。/ IInteerfaacess.var Commpossitee = neww Innterrfacce(Commpossitee, aadd, remmovee, geetChhildd);var ForrmIttem = nnew Intterffacee(FFormmIt

27、eem, savve);/ CCompposiiteFFormm cllasssvar CommpossiteeForrm = fuuncttionn(idd, mmethhod, acctioon) .;.funcctioon aaddFFormm(foormIInsttancce) ensuureIImpllemeentss(foormIInsttancce, Commpossitee, FFormmIteem);/ TThiss fuuncttionn wiill thrrow an errror if areequiiredd meethood iis nnot impplemment

28、ted.这种方法法区别与与前两种种方法在在于它没没有注释释。所有有的特性性都是具具有强制制力。enssureeImpplemmentt函数需需要至少少两个参参数,第第一个参参数是需需要检测测的对象象,剩下下的参数数是这个个对象需需要比较较的接口口。这个个函数检检测了第第一个参参数传递递进来的的对象是是否实现现了接口口中生命命的方法法。如果果没有,则包含含相关信信息的错错误就会会被抛出出。信息息中包含含了类名名,接口口名,以以及没有有被正确确实现的的方法名名。这个个函数可可以被放放置在任任何需要要的地方方。在这这个例子子中,你你仅需在在它实现现所需方方法的情情况下利利用adddForrm添加表表

29、单。这是三种种方法中中最有效效的,但但它仍然然有一些些缺点,一个类类从不声声明它实实现了哪哪谢方法法。这就就降低了了代码的的可重用用性。它它也没有有像其他他方法一一样有说说明。它它还需要要一个辅辅助类inteerfaace和一个个辅助函函数enssureeImpplemmentt。它没没有检查查方法的的参数数数量和名名称。也也没有类类型检查查,紧紧紧是检测测对象是是否有正正确地方方法名。本书中的的接口实实现在本书中中,我们们综合了了第一种种方法和和第三种种方法,用注释释来声明明一个类类需要支支持哪些些接口,这提升升了类的的可重用用性并有有了说明明文档。我们用用Intterffacee辅助类类和

30、Intterffacee.ennsurreImmpleemennt辅助函函数来执执行显示示检查。当对象象没有通通过检查查,就会会返回一一个相关关的错误误信息。这是Innterrfacce类和注注释相结结合的例例子:/ IInteerfaacess.var Commpossitee = neww Innterrfacce(Commpossitee, aadd, remmovee, geetChhildd);var ForrmIttem = nnew Intterffacee(FFormmIteem, savve);/ CCompposiiteFFormm cllasssvar Commpossi

31、teeForrm = fuuncttionn(idd, mmethhod, acctioon) / iimpllemeentss Coompoositte, ForrmIttem.;.funcctioon aaddFFormm(foormIInsttancce) Inteerfaace.enssureeImpplemmentts(fformmInsstannce, Coompoositte, ForrmIttem);/ TThiss fuuncttionn wiill thrrow an errror if areequiiredd meethood iis nnot impplemmentt

32、ed,/ hhalttingg exxecuutioon oof tthe funnctiion./ AAll codde bbeneeathh thhis linne wwilll bee exxecuutedd onnly if thee chheckks ppasss.Inteerfaace.enssureeImpplemmentts提供供了更严严格的检检查,如如果有问问题出现现,就会会有异常常抛出,异常可可以被扑扑捉并处处理,或或者停止止执行代代码。总总之,程程序员会会立即知知道问题题出现并并加以处处理。接口类下面就是是我们在在本书中中使用的的Intterffacee类/ CConss

33、truuctoor.var Intterffacee = funnctiion(namme, metthodds) if(aarguumennts.lenngthh != 2) throow nnew Errror(Innterrfacce cconsstruuctoor ccallled witth + arggumeentss.leengtth +arggumeentss, bbut exppectted exaactlly 22.);thiss.naame = nnamee;thiss.meethoods = ;for(varr i = 00, llen = mmethhodss.lee

34、ngtth; i leen; i+) if(ttypeeof metthoddsii != sttrinng) throow nnew Errror(Innterrfacce cconsstruuctoor eexpeectss meethood nnamees tto bbe + ppasssed in as asttrinng.);thiss.meethoods.pussh(mmethhodssi); ; / SStattic claass metthodd.Inteerfaace.enssureeImpplemmentts = fuuncttionn(obbjecct) if(aargu

35、umennts.lenngthh 2) throow nnew Errror(Fuuncttionn Innterrfacce.eensuureIImpllemeentss caalleed wwithh + arguumennts.lenngthh + aarguumennts, buut eexpeecteed aat lleasst 22.);for(varr i = 11, llen = aarguumennts.lenngthh; ii lenn; ii+) var intterffacee = arggumeentssi;if(iinteerfaace.connstrructtor

36、 != Innterrfacce) throow nnew Errror(Fuuncttionn Innterrfacce.eensuureIImpllemeentss exxpeccts arggumeentss+ ttwo andd abbovee too bee innstaancees oof IInteerfaace.);for(varr j = 00, mmethhodssLenn = intterffacee.meethoods.lenngthh; jj metthoddsLeen; j+) var metthodd = intterffacee.meethoodsj;if(!o

37、bjjecttmeethood | typpeoff obbjecctmmethhod != funnctiion) throow nnew Errror(Fuuncttionn Innterrfacce.eensuureIImpllemeentss: oobjeect + ddoess noot iimpllemeent thee + iinteerfaace.namme + intterffacee. MMethhod + meethood + wass noot ffounnd.); ;什么时候候使用接接口类严格的类类型检查查并非总总是必须须,许多多JS程序员员经年也也不曾使使用一个个接

38、口或或着类型型检查。但是当当你使用用接口去去完成一一个复杂杂的系统统时,这这会变得得非常重重要。接接口看上上去似乎乎降低了了JS的灵活活性,但但实际上上灵活性性反而得得到了提提高,因因为类之之间的耦耦合变得得更加松松散。函函数也变变得更加加灵活,因为在在你为函函数传递递进任何何类型的的参数后后,依然然能使正正确地对对象使用用正确的的方法,下面几几中情形形中接口口非常有有用在多名程程序员合合作的大大型工程程中,接接口是必必需的,通常程程序员所所需要的的API还没有有写完,或者需需要提供供占位程程序以保保证工程程的正常常进度。接口在在这种情情况下变变得非常常有价值值。它们们说明了了可用于于两个程程

39、序员之之间沟通通的API,当占占位程序序被正式式的API所替代代时。你你立即就就会知道道你所需需要的方方法是否否会被实实现。如如果API在中期期开发中中改变,另外一一个程序序员也可可以实现现相同的的接口来来无缝的的替代。包含来自自互联网网的那些些没有控控制权的的代码越越来越普普遍,外外部主机机库是其其中的一一个例子子,如搜搜索,电电邮和地地图这样样的服务务API,尽管管它们的的来源可可靠,也也要注意意确保它它们的改改变不要要导致代代码错误误。解决决途径之之一是为为你以来来的这些些API创建Intterffacee对象,然后检检测每个个对象是是否正确确的实现现了它们们的接口口。var Dynna

40、miicMaap = neew IInteerfaace(DyynammicMMap, ceenteerOnnPoiint, zooom, ddraww);funcctioon ddispplayyRouute(mappInsstannce) Inteerfaace.enssureeImpplemmentts(mmapIInsttacee, DDynaamiccMapp);mapIInsttancce.ccentterOOnPoointt(122, 334);mapIInsttancce.zzoomm(5);mapIInsttancce.ddraww();.在这个例例子中,dissplaayR

41、ooutee函数需要要传递进进来的参参数对象象拥有三三个指定定的方法法,使用用Intterffacee对象并并调用Intterffacee.ennsurreImmpleemennt方法就就可以确确定这三三个方法法是否被被实现,如果没没有则出出现错误误。错误误可以被被一个ttry/cattch语语句扑捉捉到,然然后在后后台利用用AJAAX请求提提醒你这这个外部部API的错误误。这可可以使你你的Maash-upss(指通过过多源头头信息整整合,轻轻松创建建一项新新服务)变得更更加健壮壮和隐秘秘。如何使用用接口类类最重要的的一步(也是最最难执行行的一步步)是确确定在你你的代码码中是否否值得使使用接口

42、口。难度度简单的的项目也也许从接接口那里里得不到到什么好好处。你你得自己己权衡利利弊。假假如用了了,下面面提供如如何使用用接口的的方法:在HTMML文件中中包含Intterffacee类。Intterffacee.jss文件可可以在网网站htttp:/jjsdeesiggnpaatteernss.coom/获获取。遍历并找找到找到到你的代代码中用用对象做做参数的的函数。找出这这些对象象需要那那些方法法才能使使你的代代码正常常工作为每个方方法集合合谨慎的的创建接接口移除所有有显示的的结构体体检查。因为我我们用了了鸭子类类型,对对象的类类型已经经无关紧紧要。用Intterffacee.ennsur

43、reImmpleemennt替换结结构体检检查。你从这里里面得到到了什么么?你的的代码变变得更加加松耦合合因为你你不再依依赖任何何类的实实例。相相反的你你所需要要的特性性在合适适的地方方,任何何具体的的实现都都会被使使用。给给你更多多的自由由去优化化和重构构你的代代码。实例:使使用接口口类想象一下下你创建建了一个个类,用用来自动动检测结结果并格格式化输输出为一一个网页页视图。这个类类的构造造函数用用了一个个TesstReesullt类的的实例作作为参数数。然后后他将数数据压缩缩后传入入TesstReesullt对象并并将其传传递给请请求。这这便是RResuultFFormmattter最最初的

44、样样子。/ RResuultFFormmattter claass, beeforre wwe iimpllemeent intterffacee chheckkingg.var RessulttForrmattterr = funnctiion(ressulttsObbjecct) if(!(reesulltsOObjeect insstannceOOf TTesttRessultt) throow nnew Errror(ReesulltsFFormmattter: coonsttrucctorr reequiiress ann innstaancee + oof TTesttRessul

45、tt ass ann arrgummentt.);thiss.reesulltsOObjeect = rresuultssObjjectt;ResuultFFotottypee.reendeerReesullts = ffuncctioon() var datteOffTesst = thhis.ressulttsObbjecct.ggetDDatee();var ressulttsArrrayy = thiis.rresuultssObjjectt.geetReesullts();var ressulttsCoontaaineer = doocummentt.cr

46、reatteEllemeent(diiv);var ressulttsHeeadeer = doocummentt.crreatteEllemeent(h33);resuultssHeaaderr.innnerrHTMML = TTestt Reesullts froom + datteOffTesst.ttoUTTCSttrinng();resuultssConntaiinerr.apppenndChhildd(reesulltsHHeadder);var ressulttsLiist = ddocuumennt.ccreaateEElemmentt(uul);resuultssConnta

47、iinerr.apppenndChhildd(reesulltsLListt);for(varr i = 00, llen = rresuultssArrray.lenngthh; ii lenn; ii+) var lisstIttem = ddocuumennt.ccreaateEElemmentt(lli);listtIteem.iinneerHTTML = rresuultssArrrayi;resuultssLisst.aappeendCChilld(llisttIteem);retuurn ressulttsCoontaaineer;这个类在在构造函函数中执执行了一一个检查查以保证

48、证参数确确实为TesstReesullt的实例例;如果果不是,抛出异异常。这这可以让让你代码码中的rrendderRResuultss方法知知道geetDaate方方法和ggetRResuultss方法是是可用的的。是这这样吗,在构造造函数中中,你仅仅仅检查查了resuultssObjjectt是TesstReesullt的实例例。这并并不能保保证你所所需要的的方法被被实现了了。TeestRResuult可可以被修修改并不不再拥有有一个ggetDDatee方法。这个检检查会通通过,但但rennderrRessultts就会会失效。结构体中中的检查查还有不不必要的的限制。它禁止止了其它它类的实实例作为为参数,即使它它们能很很好的运运行。例例如你有有一个WWeattherrDatta类。它有ggetDDatee和gettRessultts方法法并可以以在ReesulltFoormaatteer中运运行而没没有任何何问题。但是用用显示的的类型检检查(用用insstannceOOf操作符)就会禁禁止WeeathherDDataa的任何何实例。解决办办法是移移除innstaanceeOf检检查并用用接口代代替。第第一步是是创建接接口本身身:/ RResuult

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论