Delphi课件第6章newClassAndE.ppt

上传人:max****ui 文档编号:6336115 上传时间:2020-02-23 格式:PPT 页数:40 大小:1.13MB
返回 下载 相关 举报
Delphi课件第6章newClassAndE.ppt_第1页
第1页 / 共40页
Delphi课件第6章newClassAndE.ppt_第2页
第2页 / 共40页
Delphi课件第6章newClassAndE.ppt_第3页
第3页 / 共40页
点击查看更多>>
资源描述
第6章Delphi中类的应用 内容提要 面向对象的相关概念类的定义类的成员类的特性共同祖先Tobject简介Delphi中的VCL自定义类 6 1面向对象的相关概念 1 对象对象是现实世界中一类具有某些共同特性的事物的抽象 对象是构成系统的元素 是组成问题域的事物 这里问题域指应用系统所要解决和问题 小到一个数据 大到整个系统都是对象 对象不仅仅是物理对象 如写字台 手机等 还可以是某一类概念实体 如操系统中进程 室内照明的等级等都是对象 2 消息消息 就是指Windows发出的一个通知 告诉应用程序某个事情发生了 例如 单击鼠标 改变窗口尺寸 按下键盘上的一个键都会使Windows发送一个消息给应用程序 消息本身是作为一个记录传递给应用程序的 这个记录中包含了消息的类型及其他信息 例如 对于单击鼠标所产生的消息来说 其记录类型为TMsg 同时消息记录中还包含了单击鼠标时的坐标信息 对象进行处理及相互之间的联系 都只能通过消息传递来实现 发送消息的对象叫发送者 接受消息的对象叫接收者 发送者可以同时向各个对象传递消息 接受者可同时接受多个对象发来的消息 3 类类定义的是对象的类型 是对一组性质相同的对象的描述 它用于描述对象的所有性质 包括外部特性和内部实现 通过消息及相应的处理能力的描述 定义对象的外部特性 通过内部状态和处理能力的实现来描述定义对象的内部实现 在程序运行时 类被作为样板建立对象 对象和类的关系 就如同前面介绍的变量和类型的关系 4 继承所谓继承就是一个新的类类型 不必什么都重新定义 只需要继承一个已有的类型再加上自己的成员就构成一个新的类类型 继承是一个对象可以获得另一个对象特性的机制 类是一种层次结构 类的上层可以有子类 当某个类定义了某个特征后 所有在它下面的类都不得包启了该特征 类此子类直接继承其父类的全部描述 这叫传递性 类可以有多个父类 这叫多重继承 如果只能有一个父类 叫简单继承 Delphi中的类是简单继承 6 2类的定义 从程序设计的角度讲 类是一种数据类型 是一种特殊的数据类型 不过类定义了一种由字段 属性和方法3部分构成的数据结构 声明一个类的过程 也就是创建字段 Fields 属性 Property 方法 Method 的过程 字段 是类的内部数据变量 属性 是类提供给外部使用的数据变量 方法 是类中定义的函数和过程 三者统称为类的成员 类成员字段 属性与方法在类中有不同的作用 下面首先学习如何定义类 6 2 1类的定义 类类型声明的一般形式 Type类名 Class 父类名 类成员 End 1 类名可以是任何合法的标识符 不过Delphi有一个约定 使用大写字母T作为前缀来标识类类型 2 Class是保留字 它表明声明的类型是一个类类型 3 Class后的括号内为父类名 表明当前声明的类派生于父类名指定的类 4 Class后的括号是可选的 如果不指明其父类则表示新声明的类直接从Dephi的Tobject类继承而来 6 2 2类的实例化 类的实例化就是利用类的方法创建对象的过程 方法 1 首先声明对象变量 形式如下 Var对象变量名 类名 2 创建对象变量 分两种情况 如果类是直接由Tobject继承而来 就用如下形式创建对象 对象变量名 类名 Create 如果类重载或覆盖了Tobject的构造方法 Create 则创建对象的语句形式如下 对象变量名 类名 构造方法 参数表 例如 如下代码就是Taverage中创建一个对象的过程 Varaverage Taverage 声明对象变量average Taverage Create 创建对象实例 6 2 3类运算符 1 类型判断运算符isis运算符用来检测一个类是否与另一个类兼容 即左操作符是否是右操作规程符的同类或子类 其语法形式如下 对象变量is类名如果返回值为True 那么对象变量是类或其派生类的一个实例 如果对象为nil 返回值为false 在Windows程序设计中 经常使用is运算符判断组件的类型 例如 ForI 0toComonemtCount 1doIfComponents i isTeditthenTedit Components I Text 以上代码 逐一检测窗体中的组件是否为编辑框 如果某组件是编辑框 则清空该编辑框 2 类型强制转换运算符asas运算符是用来进行强制类型转换的 其语法形式如下 对象变量as类名as在进行类型强制转换时首先测试 然后进行转换 若转换不成功 则引起异常ElnvalidCast 例如 Components i asTedit这条语句相当于以下语句 IfComponents i isTeditthenTedit Components i ElseRaiseElnvalidCast Create 6 3类的成员 类成员由字段 属性和方法组成 6 3 1类的字段 类的字段也称为数据域 用来存储一个实例 对象 的信息 基本上可看成是一个变量 它可以是一组Delphi支持的类型变量的集合 6 3 2类的属性 类的属性用来描述类的实例 对象 的特征 它是访问对象数据的接口 属性声明中含有访问指令符 Read Write 访问指令符用来决定属性的读写方法 属性控制如何使用属性过程设置或返回一个值 由以上描述可知 属性在类中的功能主要有两个 一个是设置属性值 一个是返回属性值 与这两个功能对应的有两个存取程序 这两个存取程序分别用Read和Write关键字来定义 Read块用于获取属性的值 而Write块用于设置属性的值 也可以忽略一个块来创建只读属性或只写属性 不过属性至少要包含一个块才是有效的 定义属性用到关键字Property 属性的一般定义形式 Property属性名 属性类型 Read字段或方法 Write字段或方法 Default默认值 6 3 2类的属性 6 3 3类的方法 类的方法就是在类中定义的一个过程或函数 类的方法需要先声明后实现 方法的声明在类的声明处进行 且只包含过程或函数的首部 而方法的实现要在单元的实现部分完成 Delphi中有以下几种方法 一般方法 构造方法 析构方法及类方法 1 一般方法此类方法在类内定义 在单元内实现 既可以是过程也可以是函数 1 定义一般方法的语句格式如下 Type类名 class 父类名 保护方式关键字 Public Private等 Procedure方法名 参数表 Function方法名 参数表 返回值类型 End 2 实现一个方法的语句格式如下 Procedure类名 方法名 参数表 或者Function类名 方法名 参数表 返回值类型 常量 变量等定义 Begin 执行语句 End 3 调用一个方法的语句格式如下 对象变量 方法名 实际参数 注 一般方法的实现方法名前面要加上类名的限定 2 构造方法构造方法是一种特殊的方法 用来创建类的对象并对其进行初始化 在声明类的对象后 并没有创建该对象 只是定义了指向该类类型的一个指针 对象的创建和初始化工作是由类的构造方法来完成 在定义构造方法时 使用保留字constructor 名称通常为create 1 定义构造方法的语句格式如下 Constructor构造方法名 参数表 2 实现构造方法的语法如下 Constructor类名 构造方法名 参数表 3 调用构造方法的语句格式如下 对象变量名 类名 构造方法名 参数表 3 析构方法析构方法用来释放类的对象 并且释放对象中的其他数据结构 在定义析构函数时 使用保留字Destructor 函数名通常为Destroy 1 定义析构函数的语句格式为 Destructor析构方法名 参数表 2 实现析构方法时按照如下语法 Destructor类名 析构方法名 参数表 3 调用析构方法的语句格式如下 对象变量名 析构方法 参数表 析构方法不是必须的 只有在构造方法中分配了内存 使用了资源 打开了文件或数据库 才需要析构方法做善后处理工作 4 类方法Objectpascal中还有一种称为类方法的特殊方法 类方法跟构造有些相似 其相似之处在于它们都能由类来引用 而不必先创建一个对象实例 也就是说类方法不依赖于任何类的具体实例 一般方法只能被类的实例调用 而类方法既可以被对象实例调用 也可以被类本身引用 类方法只是表明这个方法在逻辑上与这个类有联系 类方法可以是过程 也可以是函数 类方法在类结构中定义 与一般方法的区别是在关键Procedure或之前加一个Class关键字 例如 TypeTClass ClassClassFunctionGetClassName String End 上例中 声明了一个类方法 它是一个返回类型为字符串的函数 在程序中 可以直接由类来引用类方法 例如 VarMyString String MyString TClass GetClassName 1 定义类方法的语句格式如下 ClassProcdure类名 类方法名 参数表 或者ClassFunction类名 类方法名 参数表 2 调用类方法的格式如下 类名 类方法名 参数表 或者对象变量名 类方法名 参数表 6 3 4方法的类型 一个类中的方法 可以在声明时使用不同的指示字指定为静态的 动态的 虚拟的 抽象的 消息处理程序的方法 这些指示字是Static Dynamic Virtual Message Abstract 如果不加方法指示字 系统默认为静态方法 Static 1 静态方法在声明方法时如果没有使用指示字 该方法即为静态方法 当一个静态方法被调用时 方法名前的对象变量的类名决定调用的是哪个类的方法 例如以下代码中的Fly方法即为静态方法 TypeTPlane classProcedureFly End Tjet class Tplane ProcedureFly End 2 虚拟方法虚拟方法比静态方法更灵活 更复杂 虚拟方法的地址不是在编译时确定的 而是在程序运行期间根据调用这个虚拟方法的对象实例来确定的 这种方法又称为滞后联编 虚拟方法通过指示字Virtual来声明 声明的一般形式如下 procedure方法名 参数表 Virtual function方法名 参数表 返回值类型 Virtual Constructor方法名 参数表 Virtual Destructor方法名 参数表 Virtual 例6 4 在Tplane 父类 中声明虚拟方法Fly 在子类Tcopter和Tjet中覆盖父类中的同名方法Fly TypeTplane classprocedurefly virtual 声明虚拟方法end 然后 从Tplane派生出两个子类 Tcopter和Tjet Tcopter class Tplane privatefModal String publicprocedurefly override 覆盖父类中的方法end Tjet class Tplane privatefModal String publicprocedurefly override 覆盖父类中的方法end 调用虚拟方法 varplane Tplane beignplane Tcopter Create plane Fly 调用Tcopter类的Fly方法plane destroy palne Tjet create plane Fly 调用Tjet类的Fly方法plane Destroy end 3 动态方法动态方法的使用与虚拟方法相同 只是在内部实现上 虚拟方法速度较快 但存储空间耗用大 而动态方法的存储空间耗用少 但降低了速度 动态方法通过指示字Dynamic来声明 一般形式如下 procedure方法名 参数表 Dynamic function方法名 参数表 返回值类型 Dynamic Constructor方法名 参数表 Dynamic Destructor方法名 参数表 Dynamic 如下代码声明了一个动态方法fly TypeTplane classprocedurefly Dynamic 声明动态方法end 4 抽象方法所谓抽象方法 首先必须是虚拟的或动态的 其次在它所在类中只能声明而不能定义 只能在派生类中定义它 因此定义一个抽象方法 只是定义它的接口 而不是定义底层的操作 声明抽象方法使用abstract指示字 例如 typeTdesign class Object ProcedureDraw Virtual abstract end 5 消息处理程序的方法在方法的调用约定之后加上一个message 就可以定义一个消息处理程序方法 消息处理程序方法主要用于相应并处理某个特定的事件 声明消息处理方法使用message指示字 例如 typeTbox class Tcustomcontrol PrivateProcedureWMChar VarMessage TWMchar messageWMCHAR end 6 3 5覆盖与重载 由以上学习可体会到 虚拟方法就是允许被其子类重新定义的成员函数 而子类重新定义父类虚拟方法的做法 称为 覆盖 或者称为 重写 重载 是指允许存在多个同名函数 而这些函数的参数表不同 其实 重载的概念并不属于 面向对象编程 重载的实现是编译器根据函数不同的参数表 对同名函数的名称做修饰 然后这些同名函数就成了不同的函数 如 有两个同名函数 functionfunc p integer integer 和functionfunc p string integer 那么编译器做过修饰后的函数名称可能是这样的 int func str func 对于这两个函数的调用 在编译器间就已经确定了 是静态的 6 4类的特性 类有三大特性 封装性继承性多态性 6 4 1类的封装性 类是由封装在一起的数据和方法构成的 所谓封装指的是一个类中的有些成员对其他类来说是不可能直接访问的 这些成员只能由类本身的方法或属性来访问 ObjectPascal中通过控制类成员的可见性来实现类成员的封装 一个类中 成员的可见性通过5个保留字来控制 这5个保留字是 private public protected published和automated 1 Private保留字Private表示一个类的成员是这个类所私有的 在声明这个类的单元或程序之外是不可见的 也就是说 在包含这个类的单元中 可以对定义为私有的字段和方法进行访问 而对于其他类包括它的派生类 Private部分声明的成员都是可见的 这就是面向对象编程中的数据保护机制 2 Public保留字Public表示一个类的成员是公有的 在声明这个类的单元或程序之外是可见的 这意味着在程序的任何地方都可以直接访问这些成员3 Protected保留字Protected表示一个类的成员是受保护的 受保护的成员只能被当前类和当前类的子类所访问 在Protected部分声明的成员通常是方法 这样在派生类中访问这些方法 而不需要知道这些方法实现的细节 4 Published保留字Published声明的成员是发行类型的成员 从成员的可见性来说 发行成员是最高的 公有成员和发行成员都是公共的 能够被其他类的实例引用 也就是在运行期间可以随意访问 两者的区别在于公有成员在运行期间是可以访问的 而发行成员在设计期间和运行期间都可以被访问 5 Automated保留字Automated与Public基本相同 惟一的区别在于声明为Automated的的成员会产生自动化类型信息 自动化类型信息是自动化服务器所要求的 因此 只有定义或应用自动化对象时才需要使用Automated成员类型 6 4 2类的继承性 类类型具有可继承性 所谓继承就是一个新的类类型 不必什么都重新定义 只需要继承一个已有的类型再加上自己的成员就构成一个新的类类型 被继承的类称为基类 继承下来的类称为派生类 基类的成员自动成为派生类的成员 类的继承具有传递性 例如假设T3继承了T2 而T2又是继承了T1 可以认为T3也继承T1 在Delphi中 所有的类都是从一个共同的类TObject继承下来的 6 4 2类的继承性 在Delphi中继承性很容易实现 只需在定义子类时指出它希望继承的父类即可 例如 在建立新窗体时 Delphi会自动创建Tform1类 代码如下 typeTForm1 class TForm private Privatedeclarations public Publicdeclarations end 这表明 Tform1是Tform的子类 我们可以在不添加任何组件的情况下改变窗体的属性 如Caption Width Height等 这些属性都是从Tform类继承来的 6 4 3类的多态性 相同的函数调用被不同的对象接受时 会导致完全不同的行为 这种现象称为多态性 利用多态性 程序中只需进行一般形式的函数调用 函数的实现细节留给接受函数调用的对象 多态性是问题求解的面向对象方法的一种关键性能 在ObjectPascal中 多态性是通过虚拟方法或动态方法实现的 参见 例6 5例题中的关键问题是 当程序调用Fly时 究竟调用的是哪个Fly 是基类的Fly还是派生类的Fly呢 6 5共同祖先Tobject简介 TObject是所有子类的祖先类 如果不指定父类的话 Delphi便指定父类是TObject TObject声明了一些方法 这些方法可以被继承到子类中 有些还可以被覆盖 它的方法分为以下三类 1 构造和析构方法 每个对象都有一个构造方法Create用来初始化对象 对象可以调用NewInstance分配内存 然后用将内存清0 每个对象还有一个析构方法Destroy 当对象建立后 这个函数只被调用来释放对象 2 类方法 使用类方法ClassInfo ClassName ClassParent ClassType InheritsFrom及InstanceSize 可以得到关于该类或它的实例的有用信息 还可以得到块内属性和方法的实时类型信息 FieldAddress MethodAddress及MethodName 3 消息处理 使用Dispatch和DefaultHandler调用每个对象的内置消息处理方法 6 6自定义类 在Delphi中定义一个类要用到关键字Class 例如 下面的一小段代码就定义一个名字为Employee的类 TypeTEmployee Class End 在对类命名时 微软推荐使用语言的命名规则 根据这种命名规则 就意味着类名的第一个字母必须大写 并且后面的并发连接词的第一个字母均为大写 6 6自定义类 一般自定义类的语法结构如下 TypeTClassName Class TObject public publicfields publicmethods protected protectedfields protectedmethods private privatefields privatemethods end 参见 例6 6 程序错误与处理异常处理机制异常类 发现程序错误语法错误 syntaxerror 又称编译错误 编写的语句不符合语法规范 运行错误 run timeerror 程序虽然通过了编译 但执行时却发生了无效操作 即运行错误 逻辑错误 logicerror 已通过编译 也没出现运行错误 但运行结果与期望值不一样 则程序出现了逻辑错误 启用调式器选择Tools DebuggerOption菜单项 在出现的对话框中选中复选框IntegeratedDebugger即可设置编译环境 程序错误与处理 异常概述异常 Exception 是一种特殊的事件 通俗地讲就是错误 异常响应异常保护异常保护处理程序可保证代码执行以后分配的资源能被释放 将欲保护的代码放于try finally块中 Try语句序列1 Finally语句序列2 End 异常处理机制 编写异常处理程序try语句序列1 excepton标识符 异常类do语句1 on标识符 异常类do语句2 else语句序列 end Exception类运行时间库异常外部错误异常类EExternal类型匹配异常类EInvalidCast类型转换异常类EConvertErrorI O异常类EInOutError堆异常类EHeapException对象异常类流异常类EStreamError打印异常类EPrinter图形异常类EInvalidGraphic和EInvalidGraphicOperation字符串序列异常EStringListError和EListError组件异常类通用组件异常类专用组件异常类 异常类
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!