Delphi课件第6章.ppt
《Delphi课件第6章.ppt》由会员分享,可在线阅读,更多相关《Delphi课件第6章.ppt(48页珍藏版)》请在三一办公上搜索。
1、第6章 Delphi中类的应用,内容提要,面向对象的相关概念 类的定义 类的成员 类的特性 共同祖先Tobject简介 Delphi中的VCL 自定义类,6.1 面向对象的相关概念,1.对象 对象是现实世界中一类具有某些共同特性的事物的抽象。对象是构成系统的元素,是组成问题域的事物。这里问题域指应用系统所要解决和问题。小到一个数据,大到整个系统都是对象。对象不仅仅是物理对象,如写字台、手机等,还可以是某一类概念实体,如操系统中进程、室内照明的等级等都是对象。,2.消息 消息,就是指Windows发出的一个通知,告诉应用程序某个事情发生了。例如,单击鼠标,改变窗口尺寸,按下键盘上的一个键都会使W
2、indows发送一个消息给应用程序。消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型及其他信息。例如,对于单击鼠标所产生的消息来说,其记录类型为TMsg,同时消息记录中还包含了单击鼠标时的坐标信息。对象进行处理及相互之间的联系,都只能通过消息传递来实现,发送消息的对象叫发送者,接受消息的对象叫接收者。发送者可以同时向各个对象传递消息;接受者可同时接受多个对象发来的消息。,3.类 类定义的是对象的类型,是对一组性质相同的对象的描述.它用于描述对象的所有性质,包括外部特性和内部实现。通过消息及相应的处理能力的描述,定义对象的外部特性;通过内部状态和处理能力的实现来描述定义对象的内
3、部实现。在程序运行时,类被作为样板建立对象。对象和类的关系,就如同前面介绍的变量和类型的关系。4继承 所谓继承就是一个新的类类型,不必什么都重新定义,只需要继承一个已有的类型再加上自己的成员就构成一个新的类类型。继承是一个对象可以获得另一个对象特性的机制。类是一种层次结构,类的上层可以有子类。当某个类定义了某个特征后,所有在它下面的类都不得包启了该特征。类此子类直接继承其父类的全部描述,这叫传递性。类可以有多个父类,这叫多重继承,如果只能有一个父类,叫简单继承。Delphi中的类是简单继承。,6.2 类的定义,从程序设计的角度讲,类是一种数据类型,是一种特殊的数据类型,不过类定义了一种由字段、
4、属性和方法3部分构成的数据结构。声明一个类的过程,也就是创建字段(Fields)、属性(Property)、方法(Method)的过程。字段:是类的内部数据变量。属性:是类提供给外部使用的数据变量。方法:是类中定义的函数和过程。三者统称为类的成员。类成员字段、属性与方法在类中有不同的作用。下面首先学习如何定义类。,6.2.1 类的定义,类类型声明的一般形式:Type 类名=Class(父类名)类成员 End;(1)类名可以是任何合法的标识符,不过Delphi有一个约定,使用大写字母T作为前缀来标识类类型。(2)Class是保留字,它表明声明的类型是一个类类型。(3)Class后的括号内为父类名
5、,表明当前声明的类派生于父类名指定的类。(4)Class后的括号是可选的,如果不指明其父类则表示新声明的类直接从Dephi的Tobject类继承而来。,6.2.2 类的实例化,类的实例化就是利用类的方法创建对象的过程。方法:(1)首先声明对象变量,形式如下:Var对象变量名:类名:(2)创建对象变量,分两种情况。如果类是直接由Tobject继承而来,就用如下形式创建对象:对象变量名:=类名.Create;如果类重载或覆盖了Tobject的构造方法(Create),则创建对象的语句形式如下:对象变量名:=类名.构造方法(参数表);例如,如下代码就是Taverage中创建一个对象的过程:Var a
6、verage:Taverage;/声明对象变量 average:=Taverage,Create;/创建对象实例,6.2.3 类运算符,1.类型判断运算符 is is 运算符用来检测一个类是否与另一个类兼容,即左操作符是否是右操作规程符的同类或子类,其语法形式如下:对象变量 is 类名 如果返回值为True,那么对象变量是类或其派生类的一个实例。如果对象为nil,返回值为false。在Windows程序设计中,经常使用is运算符判断组件的类型,例如:For I:=0 to ComonemtCount-1 do If Componentsi is Tedit then Tedit(Compone
7、ntsI).Text:=;以上代码,逐一检测窗体中的组件是否为编辑框,如果某组件是编辑框,则清空该编辑框。,2.类型强制转换运算符as as运算符是用来进行强制类型转换的,其语法形式如下:对象变量 as 类名 as在进行类型强制转换时首先测试,然后进行转换,若转换不成功,则引起异常ElnvalidCast。例如,Componentsi as Tedit 这条语句相当于以下语句:If Components i is Tedit then Tedit(Components i)Else Raise ElnvalidCast.Create;,6.2.4 类指针,类引用即是指向类的指针,而不是指向对象
8、的指针,定义类引用类型和类引用变量的语句格式如下:Type类引用类型=class of 类名 Var 类引用变量名:类引用类型;例如,在Taverage中定义 Type Taverage Ref=Class of Taverage;var aRef:Taverage Ref;,6.3 类的成员,类成员由字段、属性和方法组成。,6.3.1 类的字段,类的字段也称为数据域,用来存储一个实例(对象)的信息,基本上可看成是一个变量,它可以是一组Delphi支持的类型变量的集合。,6.3.2 类的属性,类的属性用来描述类的实例(对象)的特征,它是访问对象数据的接口。属性声明中含有访问指令符(Read,W
9、rite),访问指令符用来决定属性的读写方法。属性控制如何使用属性过程设置或返回一个值。,由以上描述可知,属性在类中的功能主要有两个:一个是设置属性值,一个是返回属性值,与这两个功能对应的有两个存取程序,这两个存取程序分别用Read和Write关键字来定义,Read块用于获取属性的值,而Write块用于设置属性的值。也可以忽略一个块来创建只读属性或只写属性。不过属性至少要包含一个块才是有效的。定义属性用到关键字Property,属性的一般定义形式:Property属性名:属性类型Read字段或方法Write字段或方法 Default默认值;,6.3.2 类的属性,6.3.3 类的方法,类的方法
10、就是在类中定义的一个过程或函数。类的方法需要先声明后实现。方法的声明在类的声明处进行,且只包含过程或函数的首部,而方法的实现要在单元的实现部分完成。Delphi中有以下几种方法:一般方法、构造方法、析构方法及类方法。,1.一般方法 此类方法在类内定义,在单元内实现,既可以是过程也可以是函数。(1)定义一般方法的语句格式如下:Type 类名=class(父类名)保护方式关键字(Public、Private等)Procedure方法名(参数表);Function方法名(参数表):返回值类型;.End;,(2)实现一个方法的语句格式如下:Procedure类名方法名(参数表);或者Function
11、类名方法名(参数表):返回值类型;常量、变量等定义 Begin 执行语句;End;(3)调用一个方法的语句格式如下:对象变量方法名(实际参数);注:一般方法的实现方法名前面要加上类名的限定。,2.构造方法 构造方法是一种特殊的方法,用来创建类的对象并对其进行初始化。在声明类的对象后,并没有创建该对象,只是定义了指向该类类型的一个指针,对象的创建和初始化工作是由类的构造方法来完成。在定义构造方法时,使用保留字constructor,名称通常为create。(1)定义构造方法的语句格式如下:Constructor 构造方法名(参数表);(2)实现构造方法的语法如下:Constructor类名.构造
12、方法名(参数表);(3)调用构造方法的语句格式如下:对象变量名:=类名.构造方法名(参数表);,3.析构方法析构方法用来释放类的对象,并且释放对象中的其他数据结构。在定义析构函数时,使用保留字Destructor,函数名通常为Destroy。(1)定义析构函数的语句格式为:Destructor析构方法名(参数表);(2)实现析构方法时按照如下语法:Destructor类名.析构方法名(参数表);(3)调用析构方法的语句格式如下:对象变量名.析构方法(参数表);析构方法不是必须的,只有在构造方法中分配了内存、使用了资源、打开了文件或数据库,才需要析构方法做善后处理工作。,4.类方法Object
13、pascal中还有一种称为类方法的特殊方法,类方法跟构造有些相似,其相似之处在于它们都能由类来引用,而不必先创建一个对象实例,也就是说类方法不依赖于任何类的具体实例。一般方法只能被类的实例调用,而类方法既可以被对象实例调用,也可以被类本身引用。类方法只是表明这个方法在逻辑上与这个类有联系。类方法可以是过程,也可以是函数,类方法在类结构中定义,与一般方法的区别是在关键Procedure或之前加一个Class关键字。例如:Type TClass=Class Class Function GetClassName:String;End;上例中,声明了一个类方法,它是一个返回类型为字符串的函数。,在程
14、序中,可以直接由类来引用类方法,例如:Var MyString:String;MyString:=TClass.GetClassName;(1)定义类方法的语句格式如下:Class Procdure 类名.类方法名(参数表);或者 Class Function 类名.类方法名(参数表);(2)调用类方法的格式如下:类名.类方法名(参数表);或者 对象变量名.类方法名(参数表);,6.3.4 方法的类型,一个类中的方法,可以在声明时使用不同的指示字指定为静态的、动态的、虚拟的、抽象的、消息处理程序的方法。这些指示字是Static,Dynamic,Virtual,Message,Abstract,
15、如果不加方法指示字,系统默认为静态方法(Static)。1.静态方法 在声明方法时如果没有使用指示字,该方法即为静态方法。当一个静态方法被调用时,方法名前的对象变量的类名决定调用的是哪个类的方法。例如以下代码中的Fly方法即为静态方法。Type TPlane=class Procedure Fly;End;Tjet=class(Tplane)Procedure Fly;End;,2.虚拟方法 虚拟方法比静态方法更灵活、更复杂。虚拟方法的地址不是在编译时确定的,而是在程序运行期间根据调用这个虚拟方法的对象实例来确定的,这种方法又称为滞后联编。虚拟方法通过指示字Virtual来声明,声明的一般形式
16、如下:procedure 方法名(参数表);Virtual;function 方法名(参数表):返回值类型;Virtual;Constructor 方法名(参数表);Virtual;Destructor 方法名(参数表);Virtual;,【例6.4】在Tplane(父类)中声明虚拟方法Fly,在子类Tcopter和Tjet中覆盖父类中的同名方法Fly。TypeTplane=classprocedure fly;virtual/声明虚拟方法end;然后,从Tplane派生出两个子类,Tcopter和Tjet:Tcopter=class(Tplane)privatefModal:String;p
17、ublicprocedure fly;override;/覆盖父类中的方法end;Tjet=class(Tplane)privatefModal:String;publicprocedure fly;override;/覆盖父类中的方法end;,调用虚拟方法:var plane:Tplane:beign plane:=Tcopter.Create;plane.Fly;/调用Tcopter类的Fly方法 plane.destroy;palne:=Tjet.create;plane.Fly;/调用Tjet类的Fly方法 plane.Destroy;end;,3.动态方法 动态方法的使用与虚拟方法相
18、同,只是在内部实现上,虚拟方法速度较快,但存储空间耗用大,而动态方法的存储空间耗用少,但降低了速度。动态方法通过指示字Dynamic来声明,一般形式如下:procedure 方法名(参数表);Dynamic;function 方法名(参数表):返回值类型;Dynamic;Constructor 方法名(参数表);Dynamic;Destructor 方法名(参数表);Dynamic;如下代码声明了一个动态方法fly:TypeTplane=classprocedure fly;Dynamic;/声明动态方法end;,4.抽象方法所谓抽象方法,首先必须是虚拟的或动态的,其次在它所在类中只能声明而不
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Delphi 课件

链接地址:https://www.31ppt.com/p-5386334.html