欢迎来到天天文库
浏览记录
ID:27747244
大小:62.37 KB
页数:7页
时间:2018-12-05
《tcl面向对象设计模式》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、TCL面向对象设计模式TCL面向对象设计模式•没计模式描述和解决了在软件开发与没计过程中反复发生和遇到的问题。各种版本的设计模式文献层岀不穷,很多被誉为经典之作,可见设计模式对于软件开发的重要性。不过目前大部分的的设计模式文档都是以C++,Java等作为示例代码,而目前我们的自动化测试平台也在进行00面向对象的改造,在此分享一些IncrTcl实现的模式。成员对象•一个常见问题是怎样实现一个成员对象,或者简单地说就是某个成员变S是另一个对象。解决办法就是让一个成员变量拥有另一个对象的引用,然后在构造函数和析构函数里创建和删
2、除它。例如,对象B拥有一个对象Aitcl::classA{methodprint{}{puts’’HellofromA.Mynameis$this.’’}itcl::classB{variableaconstructor{}{seta[A#auto]}用#B的构造函数创建A对象的一个实例引destructor{itcl“deleteobject$a}methodprint{}{$aprint}Bb」nstanceBc_instanceb」nstanceprintc_instanceprint运行结果:HellofromA
3、.Mynameis::B::aO.HellofromA.Mynameis::•在这个例子中还有个小tip,就是对于#3以0的川法。在tel的帮助文档是这么解释的:IfobjNamecontainsthestring"#autoM,thatstringisreplacedwithanautomaticallygeneratedname.NameshavetheformclassName4、合•尽管创建一个成员对象很容易,但是要在IncrTcl里引用成员对象的变量和方法则可能很麻烦。并且不断有关于继承是否已经陈旧过时,或者应该有更合适的开发模式的讨论。终于产生了一种可替换和避免使用继承的模式出现,对象组合。itcl::classuser{publicvariableusernameitcl::classsession{variablethisuservariablethatuserconstructor{}{setthisuser[userthisuserlsetthatuser[userthatuser]5、methodosend{itemcmd}{setobs[itcl::findobjects]setitem[stringtrimleft$itemsetpos[Isearch-exact$obs$item]if{$pos〉=0}{return[eval[lindexSobs$pos]$cmd]sessionaaosend-thisuser{configure-usernameFred)puts[aosend-thisuser{cget-username}]运行结果:Fred•confgiure和cget是IncrTel的6、内賈方法,用来对public变:W:进行存取配賈抽象工厂•抽象工厂是设计模式里一种经典的模式,T面的IncrTcl实现示例说明抽象类和纯虚方法的使用。一个抽象类不能够被实例化,仅有子类的实例对象可以被创建。纯虚函数在父类里没有定义,而是放在子类里实现。itcl::classFactory{constructor{}{#确保抽象类不被实例化.if{[namespacetail[infoclass]]==.’Factory’’}{error’’Error:can’tcreateFactoryobjects-abstractc7、lass••’}#验证是否在子类里定义了status方法if{[$thisinfofunctionstatus-body]==’"’}{error"Error:method'status'undefined."}}protectedmethodstatus{}{}%Factory#autoError:can’tcreateFactoryobjects-abstractclass.%itcl::classWidgetFactory{inheritFactory}%WidgetFactory#autoError:method8、"status’undefined.%itcl“classMyFactory{inheritFactorymethodstatus{}{putsMyFactory::status}}%MyFactory#automyFactoryO•在IncrTcl里,工厂方法实现了在父类的名词空间里创建对象的方式。在下面这个工厂方
4、合•尽管创建一个成员对象很容易,但是要在IncrTcl里引用成员对象的变量和方法则可能很麻烦。并且不断有关于继承是否已经陈旧过时,或者应该有更合适的开发模式的讨论。终于产生了一种可替换和避免使用继承的模式出现,对象组合。itcl::classuser{publicvariableusernameitcl::classsession{variablethisuservariablethatuserconstructor{}{setthisuser[userthisuserlsetthatuser[userthatuser]
5、methodosend{itemcmd}{setobs[itcl::findobjects]setitem[stringtrimleft$itemsetpos[Isearch-exact$obs$item]if{$pos〉=0}{return[eval[lindexSobs$pos]$cmd]sessionaaosend-thisuser{configure-usernameFred)puts[aosend-thisuser{cget-username}]运行结果:Fred•confgiure和cget是IncrTel的
6、内賈方法,用来对public变:W:进行存取配賈抽象工厂•抽象工厂是设计模式里一种经典的模式,T面的IncrTcl实现示例说明抽象类和纯虚方法的使用。一个抽象类不能够被实例化,仅有子类的实例对象可以被创建。纯虚函数在父类里没有定义,而是放在子类里实现。itcl::classFactory{constructor{}{#确保抽象类不被实例化.if{[namespacetail[infoclass]]==.’Factory’’}{error’’Error:can’tcreateFactoryobjects-abstractc
7、lass••’}#验证是否在子类里定义了status方法if{[$thisinfofunctionstatus-body]==’"’}{error"Error:method'status'undefined."}}protectedmethodstatus{}{}%Factory#autoError:can’tcreateFactoryobjects-abstractclass.%itcl::classWidgetFactory{inheritFactory}%WidgetFactory#autoError:method
8、"status’undefined.%itcl“classMyFactory{inheritFactorymethodstatus{}{putsMyFactory::status}}%MyFactory#automyFactoryO•在IncrTcl里,工厂方法实现了在父类的名词空间里创建对象的方式。在下面这个工厂方
此文档下载收益归作者所有