脚本语言-11面向对象编程_第1页
脚本语言-11面向对象编程_第2页
脚本语言-11面向对象编程_第3页
脚本语言-11面向对象编程_第4页
脚本语言-11面向对象编程_第5页
已阅读5页,还剩9页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

面向对象编关的书籍,了解OOP的相关知识。并且要求您具有C++编程方面的经验。TCL自身的80多条命令是不支持面向对象的,但是存在很多扩展包,它们给TCLItcl。所以我们就围绕Itcl开展论述。packagerequire 定义###File :#Description:definetheclassesforshape. :LeiYuhou itcl::classCShapeconstructorputsincr }destructorputs"[Description]incrincrm_shapeCount }#DrawpublicmethodDraw{}puts"Draw}publicmethodDescription{return“Abase}publicprocGetCounterreturn$m_shapeCount}状privatecommonm_shapeCount ;#}定义类令是Itcl::class命令,它有两个参数:第一个是类名,第二个是类的定义体。CShapeCShapes;#定义CShape的实例s,对象名字为#调用对象方法itcl::deleteobject 定义类的实例后,实例名字也成为一个TCL命令。构造函constructorarglist?init?constructor开始,后面跟着构造函数的参数列表,然后是可选的初如果省略了init部分,并且该类有基类,那么解释器会自动用空的参数列表来调用同参数列表的构造函数。TCL是否也支持这样的特点?答案是不支持,TCL中的一个类最多只能有一个构造函数。因为如果构造函数中使用args参数,就可以实现同样的功能。析构函TCL类可以有一个析构函数,当对象被删除的时候,会自动的调用析构函数。destructordestructor开始,后面跟函数体。要注意的是析构函数没有参数成员变[public|protected|private]variablevarname?init? variablepublicC++中含义完全一致。如果省略这些修饰符,那么变量就是private,这一点和C++完全一致。 itcl::classitcl::classApublicvariablem_a0{puts“Config:[setm_a]”}variablem_b1}A aconfigure–m_a200aconfigure–m_b200puts[acget–m_b]

;#a的成员变量m_apublicconfigurecget方法来设置和查configureconfigconfig语句块。例如刚才的对应的config代码,所以会打印出“Config:200”的结果。initvariableinit的值,而是在共个变量。TCL中也可以定义这样的变量,语法如下:[public|protected|private] 变量就是private类型的。总数。可以看到,这样类型的变量和名字空间中的variable定义的变量比较类似,可以在其过程中直接使用而不用variable来。m_shapeCountpublic类型的,那么可以在对象外面直接使用该变量,比如我们可以在类CShape外面这样写:puts class中初始publiccommonarrayseta1ONE2TWO3 }puts[arrayget1ONE2TWO3 classclassCTeststaticintintCTest::a[100]=对于public类型的变量,这样写是可以的。但是对于protected等类型,就。最好的解决方法就是直接在类的定义过程中,调用arrayset或者set来完成。对象方[public|protected|private]methodmethodName?arglist? method关键字,前面是可选的方法可见性publicpublicpublic类型。method后面proc命令来定classbodyarglistbodyitcl::bodyC++中,头文件定义类的接口,而在cpp文件中定义类的实现。比如CShapeGetCounterclasspublicmethod itcl::bodyCShape::GetCounter{}{return bodybodyclassName::methodNamearglist在method中,有一个TCL自动生成的变量可以使用,这就是“this”,其功能和C++中this指针完全一致。例如Shape中的方法Draw,我们可以这样写:publicpublicmethodDraw{}puts"Draw$this->[$this}this$字符来置换它,其值是本对象的名字。例如执CShapeCShapes;#定义CShape的实例s,对象名字为ssDraw ;#调用对象方法Drawitcl::deleteobject DrawDraw::s->BaseCShape来进行调用,比如Draw里面调用Description就是这样处理,这和C中的:this->Description()是完全类似的。C++中定义方法的时候,如果面加上static进行修饰,那么这个方法就成了一个所谓的类方法(一般也叫做静态方法this参数,所以不能够直接操作类中的非静态成员变量和对象方法。也就是说,这样的方法不能够针对对象进行调用。在Tcl中[public[public|protected|private] ame?arglist?methodprocmethod方法定义没有任何不一致的body来定义其实现过程。但还是存在如刚才介绍的this变量,在proc例如CShape中的方法GetCounter,就是proc方法。它简单的返回静态成员变量m_shapeCount的值。如果m_shapeCount是普通的成员变量,那么这个方法就会发生错误,抛出异常。类似,如果直接调用Description,也会促错。method$this来调用,因为我们一再强调了,类方法是不支持this的。如果我们这样写方法Draw:publicpublicmethodDraw{}puts"Draw[$thisGetCounter]$this->[$this}上面代码通过$this来调用类方法GetCounter,就会出错badbadoption"GetCounter":shouldbeoneof...sDescriptionsscget-sconfigure?-option??value-optionvalue...?sisaclassName"$thisGetCounter"(object"::s"method"::CShape::Draw"bodyline2)invokedfromwithin"s puts“Hastotal[CShape::GetCounter] 使用类和对创建对className是类名,后面跟着对象名字,然后是构造函数的参数列表。构造函数是由基类开始逐步调用的,className的构造函数总是最后被调用。如果构造函数成功,那么在当objNameobjName作为候,Itcl为我们提供了“#auto”,自动取名字。例如: 可以直接使用#auto的值作为对象的名字(1条语句#auto嵌入到对象名直接将s作为对象名字使用,结果就出错了。例如: s $s procprocTestShape{}CShape CShape lShape}itcl::deleteobject 上面的例子在过程TestShapeCShape类型的对象,但是创建方式不一样:itcl::localgShape则不会,需要Draw->BaseShape:lShapeBaseShape:::lShapeBaseShape:::gShape使用对objNameobjNamemethodNamevarname??value,那么就返回option选项的信息列表,格式如下:{选项名,初始化值,当前值}。可以同时指定多个option-value为参数。itcl::classitcl::classApublicvariableb}Amcget–amcgetmconfiguremconfigure mmconfigure–bmconfigure objNameisaclassNameclassNameobjName的类itcl::deleteobjectnamename…?。其中name是需要删除的对象名字,可以一次删除多itcl::deleteclassnamename…?。其中name是需要删除的类型,可以一次删除多个类;继ITCL支持类的继承,并且可以多重继承,也就是说一个类可以有多个基类。多重继承TCL中itcl::classitcl::class{inheritconstructor{xy}{CShape::constructor}{ setm_x$xsetm_y}destructor publicmethodGetX{}{return$m_x}publicmethodGetY{}{returnpublicmethodDescription{}{return"Pointprotectedvariable}itcl::bodyCPoint::Distance{pt}{setx[$ptGetX]sety[$pt}publicTCLpublic继承,其规则基类中定义的commonvariable类型的变量,如果在子类中可见,那么可以在子类的method方法中直接;但是如果要在类外部这些变量,必须通过基类名字来puts$CPoint::m_shapeCountputs[CShape::GetCounter]puts[CPoint::GetCounter]

CPoint类中定义了Description函数,但是基类CShape类中也有一个同名的函数。这就是我虚函OOPC++中,成员函数如果在前面加上virtual关键字,那么它就是虚函数。在ITCL中则没有这么复杂,ITCLmethodC++的思维,ITCL中类的析基类CShape中有两个成员函数,Draw以及Description;类CPoint从CShape中继承CPointCPointa4a;#a的Draw因为Draw函数是在基类CShapeCPointCPoint的实例a调用Draw函数的时候,实际上也就是调用CShape::Draw函数,该函数内部调用了CShapeDrawDescriptionCShape的,不可能调用到CPoint的成员函数。但是实际上,上面两条语句的执行结果是Draw->Point 来调用DrawDescription就是虚函数。CPoint和CShape中的Description函数,参数都是空。如果我们把基CShape的Description函数参数列表中加上几个参数,上面的两条命令也能够执行,但是find:查找类和findclassesitcl::class定义的类名;当前名字空间中的类会首先列出来,然后是其他名字空间中的。如果给出了可选参数pattern,那么就是采用stringmatchpattern匹配上的名字才会出现在结果列表中。pattern中可以包findclasses::* findobjects?pattern??-classclassName??-isaCPointCPointa4 ;#创建类CPointCPointb04 ;#创建类CPointbCShapeshape1CShapeputs"->Allclasses:[::itcl::findclassesputs"->CPointobjects:[::itcl::findobjects-classCPoint]"puts"->CShapeobjects:[::itcl::findobjects-classCShape]"puts"->Objectsbelo

温馨提示

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

评论

0/150

提交评论