中的面向对象_第1页
中的面向对象_第2页
中的面向对象_第3页
中的面向对象_第4页
中的面向对象_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、DELPHI中的面向对象,DELPHI中的面向对象,DELPHI中的面向对象,类:具有相同属性和行为的一组对象的共同描述,是对相似对象建立的模板。 对象:由类定义的对象,具体的是一个实体。 注:DELPHI中的类,类似于记录,类和记录不同在于,类有行为等区别。,类与对象,类的声明 对象的使用,DELPHI中的面向对象,DELPHI中的面向对象,类的定义格式: type 类名=class 数据成员 成员函数或过程 end; 注:成员函数或过程不允许在数据成员之上定义。,类与对象,例: type /该类中只含有数据成员。 xuesheng=class xm:string; xh:string; c

2、j:real; end; 比较记录类型 type xuesheng=record xm:string; xh:string; cj:real; end;,类与对象,DELPHI中的面向对象,类与对象,implementation type/该类中只含有数据成员。 xuesheng=class/定义xuesheng类 xm:string; xh:string; cj1:real; cj2:real; procedure show();/声明成员过程 function aver():real;/声明成员函数 end; $R *.dfm procedure xuesheng.show();/定义类成

3、员过程 begin showmessage(xm); end; function xuesheng.aver():real;/定义类成员函数 begin aver:=(cj1+cj2)/2; end;,DELPHI中的面向对象,对象的使用 1、对象的声明 对象的声明方式与变量相同 var 对象名:类名; 对象声明以后,并不能直接使用,必须先创建对象。 创建对象: 格式 对象名 . Create; 对象使用结束后,释放对象 释放对象格式: 对象名. Destroy 对象名.free,类与对象,DELPHI中的面向对象,例:我们已定义好xuesheng类 procedure TForm1.Butt

4、on1Click(Sender: TObject); var xs:xuesheng; Begin xs:=xuesheng.Create;/创建对象 xs.Destroy;/释放对象 end;,DELPHI中的面向对象,对象的使用 2、访问对象成员 格式: 对象名 . 成员 注:访问对象之前,必须先创建对象。,类与对象,DELPHI中的面向对象,例:我们已定义好xuesheng类 procedure TForm1.Button1Click(Sender: TObject); var xs:xuesheng; begin xs:=xuesheng.Create; xs.cj1:=90.5;/访

5、问数据成员 xs.cj2:=85; xs.show();/访问成员函数或过程 xs.Destroy; end;,DELPHI中的面向对象,类成员中,有三中访问权限,其标识符分别是 Private私有 只有该类的内部成员,和本单元文件能够访问 Protected保护 只有该类的内部成员和它的派生类能够访问 (以后将学习到) Public共有 类外部或内部都能访问 注:在默认情况下,类中没有加任何标识符的成员,为共有成员。,类成员的访问权限,DELPHI中的面向对象,类定义的完整格式: type 类名 = class private 私有数据成员、成员函数或过程 protected 保护数据成员、

6、成员函数或过程 public 公共数据成员、成员函数或过程 end;,类成员的访问权限,DELPHI中的面向对象,将类放入同一文件,DELPHI中的面向对象,例: type yuanxing=class private banjing:integer; yanse:string; public procedure setbanjing(i:integer); procedure setyanse(st:string); function getbanjing():integer; function getyanse():string; end; procedure yuanxing.setba

7、njing(i:integer); begin banjing:=i; end; procedure yuanxing.setyanse(st:string); begin yanse:=st; end; function yuanxing.getbanjing():integer; begin getbanjing:=banjing; end; function yuanxing.getyanse():string; begin getyanse:=yanse; end;,将类放入一个单元文件中。,例:我们已在本单元定义好yuanxing类 procedure TForm1.Button1C

8、lick(Sender: TObject); var yuan:yuanxing; begin yuan:=yuanxing.Create; yuan.setbanjing(10); yuan.setyanse(红色); showmessage(yuan.yanse); /正确,该类声明在本单元中 yuan.Destroy; end;,DELPHI中的面向对象,implementation type yuanxing=class private banjing:integer; yanse:string; public procedure setbanjing(i:integer); proc

9、edure setyanse(st:string); function getbanjing():integer; function getyanse():string; end; $R *.dfm procedure yuanxing.setbanjing(i:integer); begin banjing:=i; end; procedure yuanxing.setyanse(st:string); begin yanse:=st; end;,function yuanxing.getbanjing():integer; begin getbanjing:=banjing; end; f

10、unction yuanxing.getyanse():string; begin getyanse:=yanse; end; procedure TForm1.Button1Click(Sender: TObject); var yuan:yuanxing; begin yuan:=yuanxing.Create; yuan.setbanjing(10); yuan.setyanse(红色); showmessage(yuan.yanse); yuan.Destroy; end; end.,Unit1代码文件,将类放入单独单元文件,DELPHI语言基础,unit Unit2;/放入单独单元文

11、件 interface type yuanxing=class private banjing:integer; yanse:string; public procedure setbanjing(i:integer); procedure setyanse(st:string); function getbanjing():integer; function getyanse():string; end; implementation procedure yuanxing.setbanjing(i:integer); begin banjing:=i; end; procedure yuan

12、xing.setyanse(st:string); begin yanse:=st; end; function yuanxing.getbanjing():integer; begin getbanjing:=banjing; end; function yuanxing.getyanse():string; begin getyanse:=yanse; end; end.,unit Unit1; interface var Form1: TForm1; implementation uses unit2;/引用类文件 $R *.dfm procedure TForm1.Button1Cli

13、ck(Sender: TObject); var yuan:yuanxing; begin yuan:=yuanxing.Create; yuan.setbanjing(10); yuan.setyanse(红色); showmessage(yuan.yanse);/错误 yuan.Destroy; end; end.,.,构造函数 析构函数,DELPHI中的面向对象,构造函数析构函数 由类说明了一个对象以后,系统并没有实际创建该类的对象,只是定义了一个该对象的指针。为此我们需要构造该类的对象。 构造函数:create构造函数,是由类自动生成一个默认的create函数, 也可以通过手写crea

14、te构造函数重载它。构造函授是一个特殊函数,用constructor标识。执行create构造函数之后,对象才再内存中分配空间,创建对象。 析构函数:destroy析构函数,类自动默认一个destroy函数,也可以通过手写destroy构造函数重载它。和构造函数相反,当对象不再使用时,用于释放资源。标识符也是destructor。,构造函数析构函数,DELPHI中的面向对象,DELPHI中的面向对象,构造函数析构函数 编写程序时,当对象不再使用,必须将其释放。,构造函数析构函数,type yuanxing=class private banjing:integer; yanse:string;

15、 public constructor create();/声明构造函数 procedure setbanjing(i:integer); procedure setyanse(st:string); function getbanjing():integer; function getyanse():string; destructor Destroy; /声明析构函数 end;,DELPHI中的面向对象,constructor yuanxing.create;/构造函数 begin showmessage(构造函数!); end; destructor yuanxing.destroy;

16、/析构函数 begin showmessage(析构函数!); end; procedure TForm1.Button1Click(Sender: TObject); var y:yuanxing; begin y:=yuanxing.create;/创建对象 y.Destroy;/释放对象 end;,DELPHI中的面向对象,DELPHI中的面向对象,继承,DELPHI中的面向对象,继承:在已经存在的类的基础上构造新的类,同时增加或重新定义数据和方法。 派生类:由类的基础上构造的新的类称为派生类。 派生类的定义格式: type 派生类 = class ( 基类 ) 相关数据 end;,继承

17、,DELPHI中的面向对象,基类: Type jl = class public public数据 private private数据 protected protected数据 end;,继承,派生类: Type psl = class ( jl )/继承lj类 end; 由派生类创建的对象,能够访问基类里面的public?private?protected?,DELPHI中的面向对象,继承,派生类创建的对象,能够访问基类里面的public?private?protected? 1、public:派生类可以直接访问基类中的public数据。 2、protected:基础类中的protecte

18、d数据,将成为派生类中的private 3、private:基础类中的的private不允许在派生类中访问。但也有例外情况。若基类和派生类在同一个单元文件中,则派生类可以访问,若在不同的单元文件中则不允许访问。,DELPHI中的面向对象,基类与派生类在同一单元文件中的情况,unit jl; /基类和派生类在同一个单元文件中 interface Type jla=class/声明基类 private yanse:string; protected changdu:integer; end; Type psla=class(jla)/声明派生类 ( 继承于jla ) public procedur

19、e wx(); end; implementation procedure psla.wx(); begin yanse:=123;/正确,允许访问基类的private changdu:=12;/正确,基类protected成为派生类的private end; end.,DELPHI中的面向对象,基类与派生类在不同单元文件中的情况,DELPHI中的面向对象,unit jl; interface type jla=class private yanse:string; protected changdu:integer; end; implementation end. 基础类单元文件 jl,u

20、nit psl; interface uses jl; type psla=class(jla) /继承jla public procedure wx(); end; implementation procedure psla.wx(); begin yanse:=123;/错误,不允许访问 changdu:=12; /正确 end; end. 继承类单元文件 psl,DELPHI中的面向对象,派生类 构造函数 析构函数,DELPHI中的面向对象,派生类的构造函数和析构函数,派生类继承于基类,可以理解为,派生类中含有一个基类对象。派生类对象创建时会执行基类的构造函数吗? 派生类对象释放时,会执

21、行基类的析构函数吗?,DELPHI中的面向对象,析构函数,构造函数,type jcl=class/基础类 public constructor create(); end; type psl=class(jcl)/派生类 public end; $R *.dfm /定义基类构造函数 constructor jcl.create(); begin showmessage(基础类的create函数); end;,procedure TForm1.Button1Click( Sender: TObject); var p:psl; begin p:=psl.create; /会执行基类的构造函数吗?

22、 p.destroy; end;,DELPHI中的面向对象,type jcl=class/基础类 public constructor create(); end; type psl=class(jcl)/派生类 public constructor psl.create(); end; $R *.dfm /定义基类构造函数 constructor jcl.create(); begin showmessage(基础类的create函数); end;,constructor psl.create(); /派生类构造 begin showmessage(派生类的create函数); inheri

23、ted create; /执行基类构造函数 end; procedure TForm1.Button1Click( Sender: TObject); var p:psl; begin p:=psl.create; /会执行基类的构造函数吗? p.destroy; end;,DELPHI中的面向对象,type jcl=class/基础类 public destructor destroy(); end; type psl=class(jcl)/派生类 public end; $R *.dfm /定义基类析构函数 destructor jcl.destroy(); begin showmessa

24、ge(基础类destroy函数); end;,procedure TForm1.Button1Click( Sender: TObject); var p:psl; begin p:=psl.create; p.destroy; /会执行基类的析构函数吗? end;,DELPHI中的面向对象,type jcl=class/基础类 public destructor destroy(); end; type psl=class(jcl)/派生类 public destructor destroy(); end; $R *.dfm /定义基类析构函数 destructor jcl.destroy(

25、); begin showmessage(基础类destroy函数); end;,destructor psl.destroy(); begin showmessage(派生类destroy函数); inherited destroy; /调用基类destory end; procedure TForm1.Button1Click( Sender: TObject); var p:psl; begin p:=psl.create; p.destroy; /会执行基类的析构函数吗? end;,DELPHI中的面向对象,多态性,DELPHI中的面向对象,多态性,多态性:指同一操作,在不同的类的对象

26、中具体的实现过程不同。简单的说,具有相同的过程或函数名而完成的不同操作。,DELPHI中的面向对象,重 载,DELPHI中的面向对象,重载,重载:含有相同函数或过程名,而参数类型不同。用overload说明 例:函数的重载。,function add(i,j:integer):integer;overload;/定义函数add 重载 begin add:=i+j; end; function add(i,j:string):string;overload; /定义函数add 重载 begin add:=i+j; end; 以上两个为重载函数,根据参数系统自动的判断调用ADD函数。,DELPHI

27、中的面向对象,function add(i,j:integer):integer; begin add:=i+j; end; function add(i,j:string):string;/错误,已经有ADD函数存在 begin add:=i+j; end;,DELPHI中的面向对象,重载,继承中成员过程或函数的重载: 派生类中定义一个在基类中的成员函数,派生类生成的对象,将不能使用基类中相应的成员过程或函数。需要重载,必须得在派生类的成员过程或函数后面加上重载标识符 overload。,DELPHI中的面向对象,例:类中成员函数或过程的重载 type jl=class public fun

28、ction add(i,j:integer):integer;overload;/定义重载函数 function add(i,j:string):string;overload; /定义重载函数 end; $R *.dfm function jl.add(i,j:integer):integer; begin add:=i+j; end; function jl.add(i,j:string):string; begin add:=i+j; end;,DELPHI中的面向对象,例: type jl=class/定义基类 public function add(i,j:integer):inte

29、ger; end; psl=class(jl) /定义派生类 public function add(i,j:string):string; /基类中的ADD能使用吗?会报错吗? end; $R *.dfm function jl.add(i,j:integer):integer; begin add:=i+j; end; function psl.add(i,j:string):string; begin add:=i+j; end;,DELPHI中的面向对象,例: type jl=class/定义基类 public function add ( i,j:integer ) : intege

30、r ; end; psl=class(jl) /定义派生类 public function add(i,j:string):string;overload /基类中的ADD能使用吗? end; $R *.dfm function jl.add(i,j:integer):integer; begin add:=i+j; end; function psl.add(i,j:string):string; begin add:=i+j; end;,DELPHI中的面向对象,虚方法,DELPHI中的面向对象,虚方法,类方法调用的实例:,type jl=class/基类 public procedure

31、 show(); end; psl=class(jl)/派生类 public procedure show(); end; $R *.dfm procedure jl.show(); begin showmessage(基础类的show方法); end; procedure psl.show(); begin showmessage(派生类的show方法); end;,procedure TForm1.Button1Click(Sender: TObject); var p,p1:jl; / p 声明为 jl 类 begin p:=psl.Create; /p创建的是psl类 p1:=ps.c

32、reate; /p1创建的是jl类 p.show; /调用的是那个show? p1.show; p.destroy; end;,该程序调用的是那个类中的show成员方法。,DELPHI中的面向对象,虚方法,procedure TForm1.Button1Click(Sender: TObject); var p:jl;/ p 声明为 jl 类 begin p:=psl.Create; /p创建的是psl类 p.show; /调用的是那个show? p.destroy; end;,该程序调用的是基类中的show成员过程。 为什么会出现这种情况呢? 作为程序员,不知道基类中包含有那些过程和函数,而我们希望的是调用派生类的成员过程或函数,那么这时就用到了虚方法。 虚方法我们在基类中声明,在派生类中重载它。,DELPHI中的面向对象,虚方法,基类中虚方法的定义: type 类名 = class public procedure 过程名(参数); virtual; /声明虚过程 function 过程名(参数); virtual; /声明虚函数 end;,派生类中虚方法重载的定义: type 类名 = class (基类) public procedure 过程名(参数); override; /重载虚过程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论