1、2023年12月12日星期二DELPHI程序设计基础教程第六章 面向对象t本章学习导读t6.1 面向对象的概念 t6.2 类t6.3 方法和属性 t6.4 对象的应用t6.5 继承t6.6 多态t6.7 接口 t本章小结2023年12月12日星期二DELPHI程序设计基础教程本章学习导读 使用面向对象技术是开发复杂的、基于图形用户界面的软件的必然选择,掌握面向对象技术可以帮助我们开发出复杂、高级的系统,这些系统既完整,又可扩充,把对象作为基本实体看待的面向对象的模型是OOP的基础,这种模型可以使对象之间相互作用。2023年12月12日星期二DELPHI程序设计基础教程6.1面向对象的概念t6.
2、1.1 面向对象的基本原理 t6.1.2 建面向对象思想2023年12月12日星期二DELPHI程序设计基础教程6.1.1 面向对象的基本原理 根据人类对客观世界的 认知规律,面向对象方法对复杂的客观世界进行如下抽象和认识:(1)观世界由各种各样的实体组成,这些实体称为对象。(2)每个对象具有各自的状态和运动规律,受其它对象或外界环境的影响,对象会根据发生的具体时间做出不同的反应,进行对象间的交互。(3)按照对象的专业和运动规律的相似,可以将相近的对象划为一类。(4)复杂的对象由相对简单的对象通过一定的方式组成。(5)不同对象的组合及对象间的相互作用和联系构成了各种不同的系统,构成人们所面催的
3、客观世界。2023年12月12日星期二DELPHI程序设计基础教程6.1.1 面向对象的基本原理 面相对象技术的特点可以概括为抽象性、继承性、封装性和多态性。(1)抽象性:指对现实世界中某一类实体或事件进行抽象,从中提取共同信息,找出共同规律;反过来,又可以把它们集中在一个集合中,定义为所设计目标系统中的对象。(2)继承性:新的对象类可以通过继承原有对象类的某些特征或全部特征而产生出来,原有的对象类称为基类,新的对象类称为派生类,派生类可以直接继承基类的共性,派生类还可以添加自己所独有的特点。继承性简化了新对象类的设计。(3)封装性:是指对象的使用者通过预先定义的接口关联到某一对象的服务和数据
4、时,无需知道对象内部运行的细节。(4)多态性:是指不同类型的对象对相同的操作做出适当的不同响应的能力。2023年12月12日星期二DELPHI程序设计基础教程6.1.2 建面向对象思想t详见教材.2023年12月12日星期二DELPHI程序设计基础教程6.2 类t6.2.1 类的概念t6.2.2 类成员 t6.2.3 可见性 2023年12月12日星期二DELPHI程序设计基础教程6.2.1 类的概念 类是用来创建对象的模板,类定义对象的共同特性,包括数据和操作。我们可以通过类声明来定义类,然后使用类来创建对象。类声明是用来创建对象的抽象模板,由类创建对象的过程是实例化的过程,每各对象都是类的
5、一个实例。类声明语法如下:type type 类名类名=class(=class(基类基类)数据成员声明数据成员声明 函数成员声明函数成员声明 end;end;2023年12月12日星期二DELPHI程序设计基础教程6.2.2 类成员 类的成员包括数据成员和函数成员。数据成员用来表示类中的数据变量。函数成员用来表示类中的操作。DELPHI中的函数成员包括构造函数、析构函数、方法和属性:(1)构造函数和析构函数是一种特殊的方法,用于创建和销毁对象。创建对象时用构造函数给对象分配相应的内存空间,销毁对象时使用析构函数来删除对象并释放相应的存储空间供新创建的对象使用。(2)方法是封装在类中的过程和函
6、数。(3)属性是访问对象数据的手段,也可以说是一种方法,可以设定对对象数据的访问方式(读取还是写入)。2023年12月12日星期二DELPHI程序设计基础教程6.2.3 可见性 DLEPHI中类成员的可见性由四种:public(公有的)、protected(保护的)、private(私有的)和published(公布的)。加上这些限定符,类的定义语法为:type type 类名类名=class(=class(基类基类)private private 类成员定义;类成员定义;protected protected 类成员定义;类成员定义;public public 类成员定义;类成员定义;pub
7、lished published 类成员定义;类成员定义;end;end;2023年12月12日星期二DELPHI程序设计基础教程6.2.3 可见性tpublic成员是完全可访问的成员,可见性最大。该成员访问方便,不受限制。缺省情况下,类成员可见性是public。published与public具有相同的可见性。不同的是,published成员会产生RTTI。tprivate成员只能在声明它的类中被访问,它的派生类和实例都无法访问。DELPHI的private并不是严格意义上的私有,在同一个单元文件中,类的私有成员是可以被其它类访问的。通过私有成员的限制,可以更好的封装和保护自己的类。tpro
8、tected成员在声明它的单元文件中是随时可用的,并且在它的派生类中也是可用的。在派生类的所有方法定义中,既可以调用protected方法,也能读取或写入protected数据成员或属性。t在继承中,可以在派生类中通过重新声明来 扩大一个类成员的可见性,但不能降低它的可见性。如一个protected属性在派生类中不能改为private,但是可以被改为public。另外published成员不能在派生类中改为public。2023年12月12日星期二DELPHI程序设计基础教程6.3 方法和属性t6.3.1 方法的概念t6.3.2 方法的绑定t6.3.3 属性2023年12月12日星期二DELP
9、HI程序设计基础教程6.3.1 方法的概念 方法就是过程和函数,只不过是在类中定义,用来实现对象的操作,它属于特定的对象。在DELPHI中,方法的声明和实现是分开的。声明的语法如下:type type 类名类名=class=class(基类)(基类)可见性限定符可见性限定符 procedure procedure 方法名(参数表);方法名(参数表);function function 方法名(参数表):返回值类型方法名(参数表):返回值类型;end;end;2023年12月12日星期二DELPHI程序设计基础教程6.3.1 方法的概念 实现一个方法的语法如下:procedure procedu
10、re 类名类名.方法名(参数表);方法名(参数表);常量、变量定义常量、变量定义 begin begin 执行语句;执行语句;end;end;或者 function function 类名类名.方法名(参数表):返回值类型;方法名(参数表):返回值类型;常量、变量定义常量、变量定义 begin begin 执行语句;执行语句;end;end;2023年12月12日星期二DELPHI程序设计基础教程6.3.1 方法的概念 调用一个方法的语法如下:对象实例名对象实例名.方法名方法名(实参实参););2023年12月12日星期二DELPHI程序设计基础教程6.3.2 方法的绑定 方法的绑定指的是建立
11、方法调用和方法体之间的联系。如果绑定动作发生于程序执行之前,那么这种绑定称为“早绑定”或“先期绑定”。如果绑定动作在程序执行时根据对象类型完成,那么这种绑定称为“晚绑定”或“后期绑定”。“后期绑定”也称为动态绑定。根据方法的绑定机制可以将方法分为静态(static)方法、虚(virtual)方法和动态(dynamic)方法,其中虚方法和动态方法又可以时抽象(abstract)方法。TMyClass=class TMyClass=class procedure IAmAStatic;/procedure IAmAStatic;/静态方法静态方法 procedure IAmAVirtual;vir
12、tual;/procedure IAmAVirtual;virtual;/虚方法虚方法 procedure IAmADynamic;dynamic;/procedure IAmADynamic;dynamic;/动态方法动态方法 procedure IAmAVirtualAbstract;virtual;abstract;/procedure IAmAVirtualAbstract;virtual;abstract;/虚抽虚抽象方法象方法 2023年12月12日星期二DELPHI程序设计基础教程6.3.3 属性 可以把属性看成是能对类中的数据进行修改和执行代码的特殊的辅助数据成员,属性看上去很
13、像一个数据成员,但本质上它是函数成员。对组件来说,属性就是列在对象编辑器窗口中的内容。2023年12月12日星期二DELPHI程序设计基础教程6.4 对象的应用 t6.4.1 对象的定义t6.4.2 对象的创建 t6.4.3 对象的使用 2023年12月12日星期二DELPHI程序设计基础教程6.4.1 对象的定义t对象可以视为一组相关的操作代码和数据组合:对象可以视为一组相关的操作代码和数据组合:对象封装了方法和数据,并提供外部调用的接口。这使得对象可以作为一个独立的整体安全使用,维护了自身的完整性和可操作性。在面向对象程序设计中,过程和函数被称作方法成员,数据被称作数据成员。t对象是类的实
14、例:对象是类的实例:对象是一种特殊的变量,它所属的数据类型是“类”类型。t对象可以相互协作:对象可以相互协作:对象之间可以通过发送消息请求而相互联系,在消息中可以调用方法和设置属性。t通过继承或封装等方式可以产生新的对象:通过继承或封装等方式可以产生新的对象:用这些方法产生新对象可以实现代码的重用以隐藏系统的复杂性。2023年12月12日星期二DELPHI程序设计基础教程6.4.2 对象的创建 t对象的生命周期 对象是类的动态实例,对象是通过类创建的。每个对象都有其生命周期。一个对象的生命周期有三个阶段:产生、活动和消亡。我们在编程过程中也要实现对应的工作:创建、运行和销毁。t对象的构造 在使
15、用一个对象前,首先要声明对象的类型,也就是说要先声明一个类。t对象的析构 析构函数的作用与构造函数的作用正好相反,它用于销毁对象并指定销毁对象时的动作,通常时释放对象所占用的内存空间及其他相关资源。析构函数的名称是destroy(),但使用完毕对象后,应该调用这个对象的free()方法来释放它。free()首先检查保证这个对象实例不为Nil(没有占用资源),然后它调用对象的析构函数destroy()。2023年12月12日星期二DELPHI程序设计基础教程6.4.3 对象的使用t详见教材.2023年12月12日星期二DELPHI程序设计基础教程6.5 继承 t6.5.1 继承的定义t6.5.2
16、 继承的使用 2023年12月12日星期二DELPHI程序设计基础教程6.5.1 继承的定义水果类(TFruit)柑橘类(TCitrusFruit)热带水果类(TTropicalFruit)浆果类(TBerry)藤本类(TVine)2023年12月12日星期二DELPHI程序设计基础教程6.5.2 继承的使用t详见教材.2023年12月12日星期二DELPHI程序设计基础教程6.6 多态 t6.6.1 多态与动态绑定 t6.6.2 方法的覆盖、隐藏和重载 2023年12月12日星期二DELPHI程序设计基础教程6.6.1 多态与动态绑定 动态绑定指的就是根据当引用对象的变量调用成员方法时,根据
17、对象的具体类型来选择到底调用哪个类中声明的方法,具体请看下节中方法覆盖的内容。2023年12月12日星期二DELPHI程序设计基础教程6.6.2 方法的覆盖、隐藏和重载 在DELPHI中,多态是通过覆盖方法来实现的,通过覆盖可以使一个方法在不同的派生类间表现不同的行为。DELPHI中只有在声明时用virtual或dynamic加以限定的方法才可以被覆盖以实现多态。要覆盖一个方法,需要在派生类的声明中用override代替virtual或dynamic。如果在声明一个方法时,它和继承它的方法具有相同的名称,但不包含override限定符,那么新方法仅仅是隐匿了继承下来的方法,并没有覆盖它。这两种
18、方法法在派生类中都存在,方法是静态绑定的。有时候,需要在派生类中增加一个方法,而这个方法的名称与祖先类中的某个方法名称相同。这时只需要在派生类中重新声明这个方法即可。DELPHI中,方法也支持重载。某个方法可以使overload限定符来重新声明,此时,若重新声明的方法和祖先类的方法具有不同的参数,那么它只是重载了这个方法,并没有隐匿它。当派生类调用此方法时,会根据参数来决定到底调用哪个方法。2023年12月12日星期二DELPHI程序设计基础教程6.7 接口t6.7.1 定义接口t6.7.2 实现接口 2023年12月12日星期二DELPHI程序设计基础教程6.7.1 定义接口 就像所有的DE
19、LPHI类都派生于TObject一样,所有的接口都派生于一个被称为是IunKnown的接口。我们已经掌握了建立DELPHI类的方法,定义接口对我们来说是一件很简单的事情,下面的代码定义了一个新的接口称为Ifoo,它包含一个被称为F1()的方法:type IFoo=interface function F1:Integer;end;下面的代码声明了一个称为IBar的接口,它是从Ifoo接口继承来的:type IBar=integer(IFoo)function F2:integer;end;2023年12月12日星期二DELPHI程序设计基础教程6.7.2 实现接口 注意,一个类可以实现多个接口,只要在声明这个类时依次列出要实现的接口。编译器通过名称来把接口中的方法与实现接口类中的方法对应起来,如果一个类只是声明要实现某个接口,但并没有具体实现这个接口的方法,编译器将出错。如果一个类要实现多个接口,而这些接口中包含同名的方法,必须把同名的方法另取一个别名。2023年12月12日星期二DELPHI程序设计基础教程本章小结 通过本章的学习,读者应该可以掌握面向对象的基本概念以及面向对象技术在DELPHI中的实现方法,进行基本的面向对象编程。为开发复杂的程序提供了重要的手段。
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。