《JavaScript设计模式之接口2146.docx》由会员分享,可在线阅读,更多相关《JavaScript设计模式之接口2146.docx(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第二章 接接口接口是面向向对象的JS程序员工工具箱中最最有用的工工具之一,在在四人组的的设计模模式中关关于可重用用的面向对象象设计思想想的第一原原则就说:面向接口口编程,而而不要面向向实现编程程。这告诉诉你这个概概念有多么么重要。但问题是JJS没有内建建的方式去去实现接口口。它也没没有内建的的方法去确确定一个对对象实现了了和另一个个对象相似似的方法集集合。这造造成了对象象不能交换换使用。但但所幸JS是一门扩扩展性非常常强的语言言,这使得得它可以很很简单的增加这这些特性。这一章,我我们先看其其他语言是是如何实现现接口的,然然后来尝试试模仿它们们的精华。看看下利用JS如何实现现这些。当当然,我们们
2、最后会提提出一个可可以检查对对象是否含有有所需方法法的可重用用的类。什么是接口口接口提供了了那些方法法是对象必必须的。它它不指定如如何实现这这些方法,尽管他也也许包含(或或暗含)了了方法的含含义,例如如,如果一一个接口包包含了一个个setNName方方法,你理理所当然的的就会确定定这个方法法的实现就就是接受一一个字符串串参数,然然后将其指指定给一个个name变量。根据对象提提供的特性性来作为它它们分组的的依据。例例如,如果果一类看上上去存在很很大差异的的对象都实现了Commparaable接接口,那它它们就可以以交替使用用到ppare(anottherOObjecct)上。这允许许两个不同同的
3、类之间间建立对话话。将一个接受受类作为参参数的函数数可改为接接受一个接接口作为函函数的参数数,这就允允许将任何何具体实现现的类传递递进去。一一些没有联联系的类被被允许同等等的对待。使用接口的的好处接口在JSS的面向对对象中可以以做什么?建立一个个接口可以以起到自我说明和和提升重用用性的功效效。接口告告诉程序员员一个更易易用的类需需要实现哪哪些方法。如如果你熟悉悉一个接口口,你就已已经知道了了用任何一一个存在的的类去实现现它,提升升已存在类类可重用的的机会。接口使得不不同类之间间的沟通更更加稳固。提提前知道接接口,你就就可以减少少集成两个个对象时出出现的错误误。接口允允许你提前前指定一个个类需要
4、有有哪些特性性和操作。一一个程序员员因为需要要为某个类类编写了一一个接口,然然后把它交交给了另外外一个程序序员。第二二个程序员员一旦实现现了这个接接口,那无无论用什么么方法,这这个类都会会正常运转转。这在大大型工程中中尤为有效效。检测和和调试变得得更加简单单。在类似似与JS这样的弱弱类型语言言中,跟踪踪类型匹配配错误非常常困难。但但使用接口口就会让这这变得简单单一些,因因为如果一一但某个类类没有所期期望的类型型或者没有有实现某个个需求的接接口,显式式的错误就就会给出。然然后逻辑错错误被限制制在了它们们自己的方方法中,而而不是对象象之间中。接接口也保证证了你代码码的重用性性更加稳定定,因为所所有
5、的类必必须随着所所实现接口口的改动而而改动。如如果你为某某个接口增增加了一个个操作,而而没有为实实现这个接接口的类增增加相应的的操作,那那错误马上上就会出现现。使用接口的的缺点。使用接口并并不是没有有缺点。JS之所以是是一门非常常灵活的语语言,在很很大程度上上是由于它它的弱类型型。使用接接口就意味味着强类型,这这降低了JS的灵活性性。JS没有内内建的接口口支持,模模仿其他语语言内建的的机制常常常带来一些些风险。它它没有inteerfacce关键字。所所以你为用用来实现接接口的方法法比起C+和JAVA来都显得非常常困难。在JS中使使用任何的的接口都会会使性能有有所下降。因因为部分的的开销要用用来
6、调用另另外的函数数。我们的的实现用了了两个for循环来迭迭代遍历每每个方法到到每个请求求的接口。对对一些实现现大型接口口或很多接接口的类来来说,这种种迭代需要要花费一些些时间并对对系统性能能造成负面面影响。如如果你担心心这点,你你可以在开开发完成后后跳过这一一步,或这这给它一个个调试标志志,以便其其在产品环环境中不执执行。但必必须要保证证过早的优优化。类似似于fireebug这样可以以帮你检测测接口是否否被剥离出出来的调试试工具是非非常必须的的。最大的缺点点是你无法法使其他的的程序员严严格遵循你你所编写的的接口。在在其他语言言中inteerfacce是内建建的,如果果程序员为为某个类实实现了一
7、个个接口,编编译器就会会检查这个个类是否真真正的实现现了这个接接口。在JS中,你必必须人工的的确定给定定的类是否否实现了一一个接口。你你可以利用用代码规范范和辅助类类来缓解这这个问题,但但却无法完完全解决。如如果其他程程序员和你你共同做一一个项目而而无视你的的借口,那那你也没办办法强迫他他们。接口在其他他面向对象象语言中的的应用我们简短看看一下三种种常用的面面向对象语语言是如何何处理接口口的,你会会发现他们们之间非常常类似。我我们再“接口类”这一节中中创建inteerfacce类时,会会尽可能的的模仿这些些机制。JAVA使使用了一种种典型的方方法来实现接接口,我们们先从它开开始。这是javva
8、.ioo包中的一一个接口publiic innterfface DataaOutpput void writteBoooleann(boooleann vallue) throows IIOExcceptiion;void writteBytte(innt vaalue) thrrows IOExxcepttion;void writteChaar(innt vaalue) thrrows IOExxcepttion;void writteShoort(iint vvaluee) thhrowss IOEExcepptionn;void writteIntt(intt vallue) thro
9、ows IIOExcceptiion;.这是一个类类所必须实实现的方法法列表,与与参数和异异常联系到到一起,每每一行都是是看起来很很相似的方方法声明,异异常后面是是分号,而而不是一对对大括号。创建一个使使用这个借借口的类,需需要impleementts关键字字publiic cllass DataaOutpputSttreamm exttendss FillterOOutpuutStrream impllemennts DDataOOutpuut publiic fiinal voidd wriiteBoooleaan (boooleaan vaalue) thrrows IOExxceptt
10、ion writee (vaalue ? 1 : 0);.每一个接口口中列出的的方法都被被声明和实实现,如果果某个方法法没有被实实现,错误误就会在编编译的时候候显示,类类似如下MyClaass sshoulld bee decclareed abbstraact; it ddoes not defiine wwriteeBoollean(boollean) in MyCllass.PHP使用用了相同的的语法:interrfacee MyIInterrfacee publiic funcctionn intterfaaceMeethodd($arrgumeentOnne, $arguumentt
11、Two);classs MyCClasss impplemeents MyInnterfface publiic fuunctiion iinterrfaceeMethhod($arguumenttOne, $arrgumeentTwwo) returrn $aargummentOOne . $arrguemmntTwwo;classs BaddClasss immplemmentss MyIInterrfacee / Noo metthod decllaratioons./ BaadClaass ccausees thhis eerrorr at run-timee:/ Faatal err
12、oor: CClasss BaddClasss coontaiins 11 absstracct meethodds annd muust tthereeforee be / deeclarred aabstrract (MyIInterrfacee:innterffaceMMethood)还有C#interrfacee MyIInterrfacee strinng innterffaceMMethood(sttringg arggumenntOnee, sttringg arggumenntTwoo);classs MyCClasss : MMyIntterfaace publiic stt
13、ringg intterfaaceMeethodd(strring arguumenttOne, strring arguumenttTwo) returrn arrgumeentOnne + arguumenttTwo;classs BaddClasss : MyInnterfface / Noo metthod decllarattionss./ BaadClaass ccausees thhis eerrorr at comppile-timee:/ BaadClaass ddoes not impllemennt innterfface membber MMyIntterfaace.i
14、interrfaceeMethhod()所有这些语语言都大体体上使用了了相同的方方法。一个个接口包含含了那些方方法需要被被实现,以以及这些方方法需要的的参数。在在类中,先先是声明了了它要实现现哪个接口口,通常是是使用impllemennts关键字。每每个类都可可以实现不不止一个接接口。如果果接口中的的哪个方法法没有被实实现,错误误就会抛出出。根据语语言的不同同,这会在在编译或者者运行时发发生。错误误信息告诉诉用户三件件事:类名名,接口名名,未被实实现的方法法名。很明显,我我们不能用用同样的途途径实现借借口,因为为JS中没有inteerfacce和impllemennts关键字。因因此不能在在运
15、行时检检查是否遵遵循接口。然然而,使用用辅助类和和显式的遵遵从性检查查以模拟接接口的大部部分特性确确实可能的的。在JS中模模拟接口我们将讨论论在JS中模拟接接口的三种种方法:注注释,属性性检查和鸭鸭子类型,没没有哪种方方案是完美美的,但结结合这三种种方法就会会趋于完美美。用注释描述述接口最简单也是是效果最差差的接口模模拟是使用用注释。模模仿其他面面向对象语语言的方式式,在注释释中使用inteerfacce和impllemennts关键字。这这无法检测测语法错误误,这有一一个例子显显示了关键键字如何被被添加到代代码中以起起到说明的的作用。/*interrfacee Commposiite fun
16、cttion add(chilld);functtion remoove(cchildd);functtion getCChildd(inddex);interrfacee ForrmIteem functtion savee();*/var CCompoositeeFormm = ffuncttion(id, methhod, actiion) / impplemeents Comppositte, FFormIItem.;/ Immplemment the Comppositte innterfface.CompoositeeFormm.proototyype.aadd = funncti
17、oon(chhild) .;CompoositeeFormm.proototyype.rremovve = funcctionn(chiild) .;CompoositeeFormm.proototyype.ggetChhild = fuunctiion(iindexx) .;/ Immplemment the FormmItemm intterfaace.CompoositeeFormm.proototyype.ssave = fuunctiion() .;这并没有很很好的模拟拟接口的功功能,他没没有检查以以确保comppositteForrm确实实现现了正确地地方法集合合。也没有有抛出错误
18、误以通知程程序员问题题所在,除除了说明外外它没有起起到任何作作用。所有有的一致性性都要靠程程序员完全全自发完成成。然而,这种种方法也有有一些优点点,它容易易实现,不不需要额外外的类或函函数。提升升了可重用用性,因为为类有了接接口说明并并且可以跟跟其他实现现了相同接接口的类交交换。它不不影响文档档的大小和和执行速度度。当代码码展开式,这这些注释可可以被轻易易的剥离。避避免了因使使用接口而而造成文件件大小的增增加。但是是,由于无无法给出错错误。他不不能帮助检检查和调试试代码。用属性检查查模拟接口口第二种方法法就要严格格一些了,所所有类显示示声明了所所要实现的的接口,这这些声明被被想要与这这些类结合
19、合的对象检检查,接口口依然仅仅仅是个注释释,但是你你现在可可可以检查一一个属性,看看它的类“自称”实现了一一个什么接接口。/*interrfacee Commposiite functtion add(chilld);functtion remoove(cchildd);functtion getCChildd(inddex);interrfacee ForrmIteem functtion savee();*/var CCompoositeeFormm = ffuncttion(id, methhod, actiion) this.impllemenntsInnterffacess = Co
20、mmposiite, FoormIttem;.;.functtion addFForm(formmInsttancee) if(!iimpleementts(foormInnstannce, Commposiite, FoormIttem) throww neww Errror(Objeect ddoes not impllemennt arrequiired inteerfacce.);./ Thhe immplemmentss funnctioon, wwhichh cheecks to ssee iif ann objject decllaress thaat itt / immplem
21、mentss thee reqquireed innterffacess.functtion impllemennts(oobjecct) for(vvar ii = 11; i arrgumeents.lenggth; i+) / Looopinng thhrouggh alll arrgumeents / affter the firsst onne.var iinterrfaceeNamee = aargummentssi;var iinterrfaceeFounnd = falsse;for(vvar jj = 00; j obbjectt.impplemeentsIInterrfac
22、ees.leengthh; j+) if(obbjectt.impplemeentsIInterrfaceesj = inteerfacceNamme) interrfaceeFounnd = truee;breakk;if(!iinterrfaceeFounnd) returrn faalse; / An iinterrfacee wass nott fouund. returrn trrue; / AAll iinterrfacees weere ffoundd.在这个例子子中,ComppositteForrm声明了它它要实现两两个接口,Comppositte和FormmItemm,这是通
23、通过把接口口们的名称称添加到一一个数组中中实现的,数数组标记为为impllemenntIntterfaaces。这个类类显示声明明了它将支支持那个类类。任何一一个使用确确定的类型型作为参数数的函数都都可以检查查其属性,如如果所要求求的接口没没有被实现现,就会抛抛出一个错错误。这种方法的的优点在于于,你说明明了一个类类实现了哪哪些接口,如如果一个没没有声明它它需要实现现的某个接接口,就会会出现错误误。你可以以利用这些些错误强迫迫其它程序序员声明这这些接口。然而它的缺缺点在于你你无法确定定类是否真真正实现了了这个接口口,你仅知知道它“自称”实现了接接口。创建建一个声明明了却忘了了实现接口口的类是非
24、非常容易的的,所有的的检测都会会通过,但但没有实现现方法,这这就造成了了潜在的问问题。当然然,显示的的声明类所所要支持的的接口无疑疑也增加了了工作两。用鸭子类型型模拟接口口事实上,一一个类是否否声明了它它所支持的的接口是无无关紧要的的,只需要要函数出现现在正确的的地方。这这就是使用用鸭子类型型的合适地地方。鸭子子类型的意意思是:“如果它走走路像鸭子子,叫起来来也像鸭子子,那它就就是鸭子”。这个技巧巧判断对象象是否为一一个类的实实例完全基基于它实现现了什么方方法。这种种方法的含含义非常简简单,如果果一个对象象中包含的的方法和这这个对象所所要实现的的接口中包包含的方法法具有相同同的名称,那那么它就
25、实实现了这个个方法。利利用辅助函函数,你可可以确定它它是否包含含相应的函函数。/ Innterffacess.var CCompoositee = nnew IInterrfacee(Coompossite, add, rremovve, gettChilld);var FFormIItem = neew Innterfface(ForrmIteem, saave);/ CoompossiteFForm classsvar CCompoositeeFormm = ffuncttion(id, methhod, actiion) .;.functtion addFForm(formmInstta
26、ncee) ensurreImpplemeents(formmInsttancee, Coompossite, ForrmIteem);/ Thhis ffuncttion willl thrrow aan errror if aarequuiredd metthod is nnot iimpleementted.这种方法区区别与前两两种方法在在于它没有有注释。所所有的特性性都是具有有强制力。ensuureImmplemment函数需要要至少两个个参数,第第一个参数数是需要检检测的对象象,剩下的的参数是这这个对象需需要比较的的接口。这这个函数检检测了第一一个参数传传递进来的的对象是否否实现了接
27、接口中生命命的方法。如如果没有,则则包含相关关信息的错错误就会被被抛出。信信息中包含含了类名,接接口名,以以及没有被被正确实现现的方法名名。这个函函数可以被被放置在任任何需要的的地方。在在这个例子子中,你仅仅需在它实实现所需方方法的情况况下利用addFForm添加表单单。这是三种方方法中最有有效的,但但它仍然有有一些缺点点,一个类类从不声明明它实现了了哪谢方法法。这就降降低了代码码的可重用用性。它也也没有像其其他方法一一样有说明明。它还需需要一个辅辅助类interrfacee和一个辅辅助函数ensuureImmplemment。它没有有检查方法法的参数数数量和名称称。也没有有类型检查查,紧紧是
28、是检测对象象是否有正正确地方法法名。本书中的接接口实现在本书中,我我们综合了了第一种方方法和第三三种方法,用用注释来声声明一个类类需要支持持哪些接口口,这提升升了类的可可重用性并并有了说明明文档。我我们用Inteerfacce辅助类和Inteerfacce.ennsureeImpllemennt辅助函数数来执行显显示检查。当当对象没有有通过检查查,就会返返回一个相相关的错误误信息。这是Intterfaace类和注释释相结合的的例子:/ Innterffacess.var CCompoositee = nnew IInterrfacee(Coompossite, add, rremovve, g
29、ettChilld);var FFormIItem = neew Innterfface(ForrmIteem, saave);/ CoompossiteFForm classsvar CCompoositeeFormm = ffuncttion(id, methhod, actiion) / impplemeents Comppositte, FFormIItem.;.functtion addFForm(formmInsttancee) Interrfacee.enssureIImpleementts(foormInnstannce, Comppositte, FFormIItem);/
30、Thhis ffuncttion willl thrrow aan errror if aarequuiredd metthod is nnot iimpleementted,/ haaltinng exxecuttion of tthe ffuncttion./ Alll coode bbeneaath tthis linee willl bee exeecuteed onnly iif thhe chheckss passs.Interrfacee.enssureIImpleementts提供了了更严格的的检查,如如果有问题题出现,就就会有异常常抛出,异异常可以被被扑捉并处处理,或者者停止
31、执行行代码。总总之,程序序员会立即即知道问题题出现并加加以处理。接口类下面就是我我们在本书书中使用的的Inteerfacce类/ Coonstrructoor.var IInterrfacee = ffuncttion(namee, meethodds) if(arrgumeents.lenggth != 2) throww neww Errror(Inteerfacce coonstrructoor caalledd witth + arrgumeents.lenggth +arguumentts, bbut eexpeccted exacctly 2.);this.namee = nnam
32、e;this.methhods = ;for(vvar ii = 00, leen = methhods.lenggth; i len; i+) if(tyypeoff metthodssi != strring) throww neww Errror(Inteerfacce coonstrructoor exxpectts meethodd nammes tto bee + paassedd in as aastriing.);this.methhods.pushh(metthodssi); ; / Sttaticc claass mmethood.Interrfacee.enssureII
33、mpleementts = funcctionn(objject) if(arrgumeents.lenggth 2) throww neww Errror(Funcctionn Intterfaace.eensurreImpplemeents callled wwith + argummentss.lenngth + arguumentts, bbut eexpeccted at lleastt 2.);for(vvar ii = 11, leen = arguumentts.leengthh; i leen; ii+) var iinterrfacee = aargummentssi;if
34、(innterfface.consstrucctor != Inteerfacce) throww neww Errror(Funcctionn Intterfaace.eensurreImpplemeents expeects arguumentts+ twwo annd abbove to bbe innstannces of IInterrfacee.);for(vvar jj = 00, meethoddsLenn = iinterrfacee.metthodss.lenngth; j metthodssLen; j+) var mmethood = inteerfacce.meeth
35、oddsj;if(!oobjecctmeethodd | typpeof objeectmmethood != funcctionn) throww neww Errror(Funcctionn Intterfaace.eensurreImpplemeents: objject + dooes nnot iimpleementt thee + intterfaace.nname + iinterrfacee. Meethodd + metthod + was not founnd.); ;什么时候使使用接口类类严格的类型型检查并非非总是必须须,许多JS程序员经经年也不曾曾使用一个个接口或着着类
36、型检查查。但是当当你使用接接口去完成成一个复杂杂的系统时时,这会变变得非常重重要。接口口看上去似似乎降低了了JS的灵活性性,但实际际上灵活性性反而得到到了提高,因因为类之间间的耦合变变得更加松松散。函数数也变得更更加灵活,因因为在你为为函数传递递进任何类类型的参数数后,依然然能使正确确地对象使使用正确的的方法,下下面几中情情形中接口口非常有用用在多名程序序员合作的的大型工程程中,接口口是必需的的,通常程程序员所需需要的API还没有写写完,或者者需要提供供占位程序序以保证工工程的正常常进度。接接口在这种种情况下变变得非常有有价值。它它们说明了了可用于两两个程序员员之间沟通通的API,当占位位程序
37、被正正式的API所替代时时。你立即即就会知道道你所需要要的方法是是否会被实实现。如果果API在中期开开发中改变变,另外一一个程序员员也可以实实现相同的的接口来无无缝的替代代。包含来自互互联网的那那些没有控控制权的代代码越来越越普遍,外外部主机库库是其中的的一个例子子,如搜索索,电邮和和地图这样样的服务API,尽管它它们的来源源可靠,也也要注意确确保它们的的改变不要要导致代码码错误。解解决途径之之一是为你你以来的这这些API创建Inteerfacce对象,然然后检测每每个对象是是否正确的的实现了它它们的接口口。var DDynammicMaap = new Inteerfacce(DDynamm
38、icMaap, ceenterrOnPooint, zzoom, ddraw);functtion dispplayRRoutee(mappInsttancee) Interrfacee.enssureIImpleementts(maapInsstacee, DyynamiicMapp);mapInnstannce.ccenteerOnPPointt(12, 34);mapInnstannce.zzoom(5);mapInnstannce.ddraw();.在这个例子子中,dispplayRRoutee函数需要传传递进来的的参数对象象拥有三个个指定的方方法,使用用Inteerfacce对象并调
39、调用Inteerfacce.ennsureeImpllemennt方法就可可以确定这这三个方法法是否被实实现,如果果没有则出出现错误。错错误可以被被一个trry/caatch语语句扑捉到到,然后在在后台利用用AJAX请求提醒醒你这个外外部API的错误。这这可以使你你的Massh-upps(指通过多多源头信息息整合,轻轻松创建一一项新服务务)变得更更加健壮和和隐秘。如何使用接接口类最重要的一一步(也是是最难执行行的一步)是是确定在你你的代码中中是否值得得使用接口口。难度简简单的项目目也许从接接口那里得得不到什么么好处。你你得自己权权衡利弊。假假如用了,下下面提供如如何使用接接口的方法法:1. 在
40、HTMLL文件中包包含Inteerfacce类。Inteerfacce.jss文件可以以在网站hhttp:/jssdesiignpaatterrns.ccom/获获取。2. 遍历并找到到找到你的的代码中用用对象做参参数的函数数。找出这这些对象需需要那些方方法才能使使你的代码码正常工作作3. 为每个方法法集合谨慎慎的创建接接口4. 移除所有显显示的结构构体检查。因因为我们用用了鸭子类类型,对象象的类型已已经无关紧紧要。5. 用Inteerfacce.ennsureeImpllemennt替换结构构体检查。你从这里面面得到了什什么?你的的代码变得得更加松耦耦合因为你你不再依赖赖任何类的的实例。相相
41、反的你所所需要的特特性在合适适的地方,任任何具体的的实现都会会被使用。给给你更多的的自由去优优化和重构构你的代码码。实例:使用用接口类想象一下你你创建了一一个类,用用来自动检检测结果并并格式化输输出为一个个网页视图图。这个类类的构造函函数用了一一个TesstRessult类类的实例作作为参数。然然后他将数数据压缩后后传入TesttResuult对象并将将其传递给给请求。这这便是ReesulttFormmatteer最初的的样子。/ ReesulttFormmatteer cllass, beffore we iimpleementt intterfaace ccheckking.var RRe
42、sulltForrmattter = funnctioon(reesulttsObjject) if(!(resuultsOObjecct innstannceOff TesstRessult) throww neww Errror(ResuultsFFormaatterr: coonstrructoor reequirres aan innstannce + off TesstRessult as aan arrgumeent.);this.resuultsOObjecct = resuultsOObjecct;ResulltForrmattter.pprotootypee.rennderR
43、Resullts = funnctioon() var ddateOOfTesst = thiss.ressultssObjeect.ggetDaate();var rresulltsArrray = thhis.rresulltsObbjectt.gettResuults();var rresulltsCoontaiiner = doocumeent.ccreatteEleementt(diiv);var rresulltsHeeaderr = ddocumment.creaateEllemennt(hh3);resulltsHeeaderr.innnerHTTML = Teest RRes
44、ullts ffrom + dateeOfTeest.ttoUTCCStriing();resulltsCoontaiiner.appeendChhild(resuultsHHeadeer);var rresulltsLiist = doccumennt.crreateeElemment(ul);resulltsCoontaiiner.appeendChhild(resuultsLList);for(vvar ii = 00, leen = resuultsAArrayy.lenngth; i lenn; i+) var llistIItem = doocumeent.ccreatteElee
45、mentt(lii);listIItem.inneerHTMML = resuultsAArrayyi;resulltsLiist.aappenndChiild(llistIItem);returrn reesulttsConntainner;这个类在构构造函数中中执行了一一个检查以以保证参数数确实为TesttResuult的实例;如果不是是,抛出异异常。这可可以让你代代码中的rrendeerRessultss方法知道道getDDate方方法和geetRessultss方法是可可用的。是是这样吗,在构造函数中,你仅仅检查了resultsObject 是TestResult的实例。这并不能保证你所需要的方法被实现了。TestResult可以被修改并不再拥有一个getDate方法。这个检查会通过,但renderResults就会失效。结构体中的的检查还有有不必要的的限制。它它禁止了其其它类的实实例作为参参数,即使使它们能很很好的运行行。例如你你有一个WWeathherDaata类。它它有gettDatee和getRResullts方法法并可以在在ResuultFoormattter中中运行而没没有任何问问题。
限制150内