📄 chapt7.htm
字号:
<html><head><title>第七章 对象与类类型</title><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></head><body bgcolor="#00000" text="#00cc66"><p align="center"><font color="#FF6666" size="4"><b>第七章 对象与类类型</b></font></p><p> 从用户角度考虑,用户并不需要了解面向对象编程,就可编写Delphi应用程序。当用户在建立新窗体,添加新构件以及处理事件时,大部分相关代码会由Delphi自动产生。但是,知道语言及其细节,对理解Delphi正在做什么并完全掌握它是很有帮助的。特别是有关类类型的概念及用法是学习后面构件编程及Delphi深入编程的基础。<br> 面向对象的编程语言基于三个基本概念:类、继承及多态性。类实际上是用户自定义数据类型之一,只是因为增加了方法、继承、多态等要素,从而在面向对象的编程中变得十分重要。类是Object Pascal面向对象编程的基础。类类型具有可继承性,被继承的类我们称为祖先类(基类),继承下来的类我们称为派生类(子类)。<br> 本章就有关类类型的概念及用法进行较为详细的介绍。<br> <b>7.1 类类型和对象</b><br> 类和对象是两个常用的术语,然而经常容易混淆,因此需要区别它们的定义。<br> 类与本书Pascal语言部分介绍的记录类似,也是包含有各种域的结构化数据类型,然而,类包含方法。方法就是操纵对象域数据的过程或函数。类类型把数据和方法封装在一起。<br> 对象是类的实例(instance),即由类定义的数据类型的变量。对象是实体,当程序运行时,对象为它们的内部表达占用一些内存。对象与类的关系就象变量与类型的关系。<br> 在Object Pascal中,声明类数据类型使用保留字Class。下面是类类型声明的语法规则(图7.1)。<br> 其中,heritage部分指出类的直接祖先类,其语法规则如图7.2。<br> 从以上语法示意图可以看出,类类型可以指定一个祖先类型,表示该类型是从这个指定的祖先类型继承下来的,例如:<br> Type TPoint=Class(TObject)<br> 上例中,声明了一个名叫TPoint的类类型,该类型是从类TObject继承下来的。注意:类类型的标识符一般以T打头,以区别于其它数据类型。如果声明中省略了heritage部分,表示该类型是继承缺省的祖先类TObject,例如: <br> Type TPoint=Class<br> Component List部分列出类的成员列表。从语法示意图还可以看出,类类型声明中可以没有成员列表,也可以有,其语法规则如图7.3。<br> 可以看出,类型可以有3类成员,分别是Field(字段)、Method(方法)、property(特性)。<br> 类类型中的字段也就是类的数据部分,其声明语法同记录中字段的声明语法相似,其语法规则如图7.4。<br> 其中字段的类型可以是各种数据类型,甚至是另一个类类型。Visibility Specifier部分定义构件成员的可见性。在Object Pascal中,类成员的可见性是通过这么下面几个保留字来定义的:Published,Public,Protected,Private,Automated。<br> 一个典型的类类型示例如下:<br> TDate = Class <br> private <br> Month,Day,Year:Integer;<br> public <br> constructor Create; <br> destructor Destroy;<br> override; <br> Procedure SetValue(m,d,y:Integer);<br> Function LeapYear:Boolean; <br> end;<br> 在Tdate类中,声明了三个字段, Month,Day,Year,数据类型是Integer,并且声明了一个构造Create,一个析构Destroy,一个函数LeapYear,其返回类型是Boolean,一个过程SetValue。其中三个字段,Month,Day,Year的可见性为Private表示只有类型本身的函数或过程可以访问,而在Public部分定义的函数是使用该方法的对象都可以访问的。<br> 注意:跟其它数据类型不同的是,类类型的声明只能出现在Program单元或UNIT单元最外层作用域的类型定义部分,而不能定义在变量说明部分或一个过程或函数内。因此,类类型的作用域总是全局的。<br> 在类类型中声明的方法实际上是向前的定义(forward declaration ),因为必须在类类型定义之后,在同一模块的其它某个地方声明,即在程序的Implementation区进行对该方法进行定义。例如,上面类的方法定义为:<br> implementation<br> {$R *.DFM}<br> procedure TDate.SetValue(m,d,y:integer);<br> begin<br> Day:=d; Year:=y;<br> end;<br> function TDate.LeapYear:Boolean;<br> begin <br> if (Year mod 4<>0) then LeapYear:=False <br> else if (Year mod 100<>0) then LeapYear:=True <br> else if (Year mod 400<>0) then LeapYear:=False<br> else LeapYear:=True;<br> end;<br> 访问对象中的各个成员,跟访问记录变量中的字段类似,是用对象名加一个小圆点和成员的名,例如:<br> Var ADay:TDay; <br> Leap:Boolean;<br> begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -