《第3章 面向对象编程11.ppt》由会员分享,可在线阅读,更多相关《第3章 面向对象编程11.ppt(40页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第3章章 面向对象编程面向对象编程3.1 对象和类 3.2 类的特性 3.1.1 类的定义 3.2.1 封装与继承 3.1.2 数据域 3.2.2 构造和析构函数 3.1.3 方法 3.2.3 多态性 3.1.4 属性 3.2.4 self关键字 3.1.5 事件 第第3章章 面向对象编程面向对象编程 面向对象技术是一种基于对象概念的软件开发方法,windows平台上的高级编程语言大都支持面向对象程序设计(Object Oriented Programming,OOP).使用OOP方法可以加快开发应用程序的速度,同时还可以进一步提高代码的重用性,降低开发强度。面向对象的编程是实现三个OOP概
2、念:封装,继承和多态。3.1 对象和类对象:每一个有明确意义和边界的事物每个对象都有自己的属性,对象和对象之间还有一定的关系类:对具有相同属性和相同操作的一组相似对象的定义对象就是类的一个实例3.1 对象和类3.1.1类的定义 类和记录比较相似,也是一个构造类型.定义格式:type className=class(ancestorClass)memberList;end;(其中className表示新声明类的标识 符,ancestorClass表示新声明类的基 类,类的名称通常以T开头.)3.1 对象和类(memberList是类的成员,可以声明一些变量和对象,也可以声明一些过程和函数.)例如
3、:定义一个TMyClass类 type TMyClass=class(TObject)end;组成类的成员有三种:数据域,属性和 方法.下面依次介绍:3.1 对象和类3.1.2数据域 就象一个属于某个对象的变量,数据域可以是任何一种类型也可以是一个类的实例且通常都被声明为私有的.如果用户要把数据域声明为类类型,可以像声明其他类型一样操作.在定义类时要注意,所有对数据域的声明要在属性和方法的前面.例如:type TMyClass=class(TObject)x:integer;end;3.1 对象和类3.1.3方法(method)方法是属于某个类的函数或过程.在类中方法的声明被分成两个部分,一个
4、是函数与过程的头部,另一个是函数与过程的定义部分.但在定义部分的标识符前要加类标识符和”.”来限定隶属关系.例如:type TMyClass=class(TObject)procedure DoSomething;3.1 对象和类function GetSomething:String;end;Procedure TMyClass.DoSomething;Begin End;function TMyClass.GetSomething:String;begin end;3.1 对象和类 方法根据起头部引导字的不同可以分成四种:函数,过程,构造和析构.其中构造和析构是分别用于在使用时创建一个类的
5、对象实例和释放类的对象实例.3.1.4属性(property)属性是对象状态和行为的特征值,是类中数据的外在表现.属性是类中可以在”读/写”是执行指定方法的数据域;有的属性是可读写的,有的属性则 只能读不能写.3.1 对象和类3.1.5事件(event)事件是基于一种消息处理机制,是系统向窗口发送消息的结果.delphi中的事件是在收到相应的windows消息后被触发的.如果用户单击按钮,就会触发按钮的单击事件,可以为按钮的单击事件编写处理程序.3.2类的特性3.2.1封装与继承 在delphi 中,如果不指明父类,则默认的父类为TObject类,也就是直接从TObject类派生出一个新类.T
6、Object类是在System单元中定义的.类的所有成员都有一个标明”能见度”的属性,他们由保留字private,protected,public,published来说明,具体含义为:3.2类的特性1.Private 具有private属性的成员称为私有成员,不能被类所在单元以外的程序访问.(一个私有的属性不能在所在模块之外的其他模块中读写;一个私有的方法也不可以在所在模块之外的其他模块中被调用)2.Protected 具有protected属性的成员称为保护成员,可以被该类的所以派生类访问,并成为派生类的私有成员.3.public 具有public属性的成员称为公有成员,可以被该类以外的类
7、访问.3.2类的特性(如果两个类不在同一个单元文件中,则要在uses语句中包含被访问的类所在的单元名称)4.Published具有published属性的成员称为发行类型成员,它的访问权限基本与公有成员相同.(在设计期间也可以被访问)除了在类封装的时候可以限制成员的访问权限外,在后面介绍的单元文件中也可以对变量,对象,函数,和过程等的访问权限.3.2类的特性类的权限的使用:Program project1;$APPTYPE CONSOLEType THuman=class private Name:String;public Age:integer;3.2类的特性procedure SetNa
8、me(xm:String);function GetName:String;end;Procedure THuman.SetName(xm:String);Begin Name:=xm;End;function THman.GetName:String;3.2类的特性Begin result:=Name;End;Var man:THuman;Begin man:=THuman.Create;man.SetName(张三);writeln(姓名:,man.GetName);3.2类的特性Man.Age:=20;Writeln(年龄:,man.Age);Writeln(按下回车键退出.);Read
9、ln;End.(THuman类默认从TObject类派生而来)3.2类的特性3.2.2构造函数和析够函数1.使用类的步骤:(1)声明类的一个变量 (2)调用类的一个特殊函数-构造函数来进行一些初始化工作,比如按类的结构来分配内存资源,完成对象的创建.(3)对类的实例-对象进行操作,使用.(4)调用类的另一个特殊函数-析构函数,删除创建的对象,释放相应的内存资源.3.2类的特性2.构造函数 (1)作用:对象的创建和初始化 (2)使用保留字constructor,函数名为create.(3)若在定义类的时候没有定义构造函数,则系统会自动为该类生成一个默认的构造函数.(4)自定义构造函数的函数体中,
10、在开始部分使用 inherited保留字来调用父类的构造函数.3.析构函数 (1)作用:将对象删除并释放相应的内存资源,还可以保存一些数据信息和对设备进行复位.3.2类的特性(2)使用保留字destructor,函数名为destroy.(3)定义类时若没有定义析构函数,系统会自动为该类生成一个默认的析构函数.(4)在自定义的析构函数的函数体中,在结尾部分使用inherited保留字来调用父类的析构函数.4.Free过程 若对象没有被初始化,则调用析构函数时会出错,此时若调用free过程则没有问题.5.例题:说明类的封装和使用3.2类的特性program Project2;$APPTYPE CO
11、NSOLE uses SysUtils;type THuman=class private Age:integer;public Name:string;function GetAge:integer;procedure SetAge(n1:integer);end;3.2类的特性TStudent=class(THuman)public SchoolName:String;procedure ShowInf;end;TTeacher=class(THuman)public Wage:double;constructor Create(gz:double);destructor Destroy;
12、override;end;3.2类的特性function THuman.GetAge:integer;begin Result:=Age;end;procedure THuman.SetAge(n1:integer);begin Age:=n1;end;procedure TStudent.ShowInf;begin writeln(姓名:,Name,年 龄:,GetAge,学校:,SchoolName);end;3.2类的特性constructor TTeacher.Create(gz:Double);begin inherited Create;writeln(调用教师类的结构函数.);W
13、age:=gz;end;destructor TTeacher.Destroy;begin writeln(姓名为:,Name,的教师类对象被删除.);inherited Destroy;3.2类的特性end;var S1:TStudent;T1:TTeacher;begin S1:=TStudent.Create;S1.Name:=张三;S1.SetAge(19);S1.SchoolName:=某某理工学院;S1.ShowInf;S1.Destroy;3.2类的特性T1:=TTeacher.Create(1600.50);T1.Name:=陈建辉;T1.SetAge(29);writeln(
14、姓名:,T1.Name,年龄:,T1.Age,月薪:,T1.Wage);T1.Destroy;writeln(按下回车键退出.);readln;end.3.2类的特性3.2.3多态性1.类中的方法定义为下面三种方式:(1)静态方法 (2)虚拟方法 (3)动态方法2.静态重载 在类中,如果定义了一个方法,在他的派生类中也可以定义同样的方法,对于静态方 法就叫静态重载3.2类的特性例如:Progame project1;$APPTYPE CONSOLEType THuman=class procedure showInf;end;TStudent=class(THuman)procedure sh
15、owInf;end;,3.2类的特性Procedure THuman.ShowInf;begin writeln(调用THuman.ShowInf);end;procedure TStudent.ShowInf;begin writeln(调用TStudent.ShowInf);end;3.2类的特性var H1:THuamn;S1:TStudent;beginH1:=Thuman.Create;H1.showInf;H1.Destroy;H1:=TStudent.Create;H1.showInf;TStudent(H1).ShowInf;3.2类的特性H1.Destroy;S1:=TStu
16、dent.Create;S1.showInf;S1.Destroy;Writeln(按下回车键退出.);readln;end.可以看到在静态重载的情况下,showinf的调用是根据对象的类型来 确定的!3.2类的特性虚拟方法和动态方法也可以在派生类中被重载,通常称为”动态重载”.指明一个方法为动态方法或虚拟方法要使用指令字dynamic和virtual.例如:说明虚拟方法的定义及动态重载:Progame project1;$APPTYPE CONSOLE Type THuman=class procedure showInf;virtual;end;3.2类的特性TStudent=class(
17、THuman)procedure ShowInf;override;end;TTeacher=class(THuman)procedure ShowInf;override;end;procedure THuman.ShowInf;begin writeln(调用THuman.ShowInf);end;3.2类的特性procedure TStudent.ShowInf;begin writeln(调用TStudent.ShowInf);end;procedure TTeacher.ShowInf;begin writeln(调用TTeacher.ShowInf);end;var H1:THum
18、an;S1:TStudent;3.2类的特性Begin H1:=THuman.create;H1.ShowInf;H1.Destroy;H1:=TStudent.create;H1.ShowInf;TTeacher(H1).ShowInf;H1.Destroy;S1:=TStudent.create;S1.ShowInf;TTeacher(S1).ShowInf;S1.Destroy;3.2类的特性H1:=TTeacher.create;H1.ShowInf;THuman(H1).ShowInf;H1.Destroy;Readln;End;3.2类的特性3.2.4self关键字在实现方法时,方
19、法有一个隐式参数self.它是对当前对象的一个引用,在声明同类的多个对象时,使用self就只对自己的对象进行操作,不影响其他兄弟对象.例如:progame project1;$APPTYPE CONSOLE type THuman=class private Name:string;3.2类的特性Public Age:integer;procedure SetName(xm:string);function GetName:string;end;Procedure THuman.SetName(xm:string);Begin self.Name:=xm;End;function THuman.GetName:string;begin result:=self.Name;end;习题1.面向对象程序设计最核心技术是什么?Delphi如何实现面向对象的程序设计?2.解释下列术语:类 对象 方法 属性 事件,继承 3.有一个类TMan,内部数据有姓名,出生日期,性别,身高和体重等,请写出定义TMan类的代码