收藏 分享(赏)

Delphi中的类和对象.doc

上传人:jinchen 文档编号:6976625 上传时间:2019-04-29 格式:DOC 页数:8 大小:46.50KB
下载 相关 举报
Delphi中的类和对象.doc_第1页
第1页 / 共8页
Delphi中的类和对象.doc_第2页
第2页 / 共8页
Delphi中的类和对象.doc_第3页
第3页 / 共8页
Delphi中的类和对象.doc_第4页
第4页 / 共8页
Delphi中的类和对象.doc_第5页
第5页 / 共8页
点击查看更多>>
资源描述

1、谈谈 Delphi 中的类和对象 作者:佚名 来源:InterNet 加入时间:2004-11-25 谈谈 Delphi 中的类和对象1.登不了大雅之堂地理解几个概念说到类和对象,我们不能不提及这样几个概念:类,对象,实例。就我个人觉得可以这样来理解:对象指的是泛称,自然界的任何实体都可以看成一个对象;而类则是以这些对象某些特征而分成的一系列的种类;实例则是特指属于某一个类的一个对象。好啦,这些大道理我就不用多说了。不如来一个“背道而驰”的作法,我们用 Delphicode 来阐述这些外国人提出的一些令我们中国人不好理解的概念吧:varABtn:TButton;定义 ABtn 是属于 TBut

2、ton 类的一个对象,但 ABtn 不能说是一个实例,因为它还没有被创建,所以我们说这是定义了一个对象,如果说定义了一个实例,多多少少有一些不够确切。:)beginABtn:=TButton.Create(Self);/创建一个 TButton 的实例ABtn.Caption:=对象;ABtn.Free;end; 2.对象是一个地地道道的指针从物理角度来看,对象就是一段地址空间,这段地址空间的标志就是我们定义的类“变量”。所以我们可以把对象看成一个类的指针。大家知道,要访问一个指针就必须对指针初始化。对象的既然是一个指针,也必须对它进行初始化。如何初始化呢?还是说指针的初始化吧。对于一个指针可

3、以有以下两种方法来进行初始化:(一)直接分配varPint:Integer;beginnew(Pint);Pint:=12;Dispose(Pint);end;(二)指向别的已分配空间的变量varPint:Integer;i:integer;begini:=12;Pint:=i;end;有趣的是,对象这种“指针”也有两种方法初始化(一)直接分配varAForm:TForm;beginAForm:=TForm.Create(Self);AForm.ShowModal;AForm.Free;end;(二)指向别的已分配空间的实例varAForm:TForm;beginAForm:=Self;AFo

4、rm.Caption:=知道了吗?为什么会这样呢;end;file:/这个 AForm 和它所指向的 Form 实例共用同一段地址单元,所有对 AForm 操作都将反应file:/到它所对应的 Form 实例之上。说到这,我们就很好解释为什么过程(函数) 的对象参数传递时,象这样这的格式 :(一)procedure SetEdit(var Edit:TEdit);beginEdit.Text:=11;end;和(二)procedure SetEdit(Edit:TEdit);beginEdit.Text:=11;end;效果是一样的了。(一)是把一个 TEdit 实体作为参数引用的形式进行参数

5、传递,( 二)是把一个 TEdit 的对象 “指针”作为参数传递。3.类可以理解成一种特殊的数据类型我们知道数据类型可以进行强制类型转化,类即然可以理解成一种数据类型,那么它也应该可以进行类类型转。比方如下代码为一个按钮(Button1)的单击事件:(一)procedure TForm1.Button1Click(Sender: TObject);varACaption:String;beginACaption:=TButton(Sender).Caption;/Sender 从 TObject 转化到 TButtonShowMessage(Format(You clicked %s !,AC

6、aption);end;在这段代码中,Sender 是一个 TObject 型对象,我们把它强制转化为 TButton 类型。如你看得不清楚,可以参照一下我们通常的数据类型的转化:(二)procedure TForm1.Button1Click(Sender: TObject);varS_Str:String;P_Str:PChar;beginS_Str:=I love China!;P_Str:=PChar(S_Str);S_Str:=;S_Str:=String(P_Str);ShowMessage(S_Str);end;但是在面对对象的程序设计过程中,强调的是安全性,如(一) 的强制类型

7、转化存在着不安全性。如下的代码,依然是写 Button1.OnClick 事件:(三)procedure TForm1.Button1Click(Sender: TObject);beginTCanvas(Sender).Brush.Color:=clRed;end;执行一下,就会出错。这样岂不是违背了面对对象的程序设计的宗旨了吗?没有,即然是类,就应该有类特定的类强制转化方法,改(三) 的方法如下:(四)procedure TForm1.Button1Click(Sender: TObject);begin(Sender as TCanvas).Brush.Color:=clRed;end;

8、/用 as 来转化,as 就可以把错误抓住,不会影响程序的正常运行。说到这我顺便提一下 VB 吧,如果学过 VB 的人可能觉得其中的控件数组比较爽,尤其是在编写象计算器这样的程序时。但 Delphi 给我们什么呢?答案是 Delphi 也能快速简洁的开发出这样的程序。如是操作:在窗体上放一个 Edit 和十个 Button,把 Button.Caption分别设为0,1,2,.9,然后写一个按钮的 OnClick 事件如下:(五)procedure TForm1.Button1Click(Sender: TObject);beginEdit1.Text:=Edit1.Text+(Sender

9、as TButton).Caption;end;把别的 Button 的 OnClick 事件都关联到 Button1Click 上,运行程序。拍拍手! 这样计算器程序的雏形就具备了。我们用 Delphi 的类类型转化,开发出来类似 VB 中的控件数组功能的程序也是很棒的嘛!:)4.抽象类和它的实例Delphi 中有一种类为抽象类,你不能天真的直接为它创建一个实例。如:TStrings类。如下代码:(一)varStrLst:TStrings;beginStrLst:=TStrings.Create;StrLst.Add(I love Japan!);StrLst.Free;end;这是不对的。

10、那如何为诸如 TStrings 这样的抽象类构造实例呢?答案是借助它的非抽象子类。我们知道 TStrings 有一个 TStringList 非抽象子类。我们就可以这样作:(二)varStrLst:TStrings;beginStrLst:=TStringList.Create;/借助其子类的构造器,对 StrLst 进行子类化StrLst.Add(I love China!);StrLst.Free;end;(三)varStrLst:TStringList;beginStrLst:=TStringList.Create;file:/放弃吧,不要再用抽象类,完全用它的“儿子”来你的事吧 Str

11、Lst.Add(I love China!);StrLst.Free;end;5.类是一种对数据和操作高度的封装机制(一)数据封装unit Unit2;interfacetypeTEmployee=classprivateFName:String;publicConstructor Create;function GetName:String;procedure SetName(AName:String);end;implementation TEmployee constructor TEmployee.Create;beginFName:=BlazingFire;end;function

12、TEmployee.GetName: String;beginResult:=FName;end;procedure TEmployee.SetName(AName: String);beginFName:=AName;end;end.如上代码,我们就用了一个过程 SetName 和一个函数 GetName 对私有变量 FName 进行完全的封装。我们要对 FName 操作就只有这样:uses unit2;procedure TForm1.Button1Click(Sender: TObject);varAEmployee:TEmployee;beginAEmployee:=TEmployee

13、.Create;AEmployee.SetName(Rose);/利用 SetName 来设置 FNameMessageBox(Handle,PChar(AEmployee.GetName),Empoyee,0);file:/用 GetName 来访问 FNameAEmployee.Free;end;(二)操作封装unit Unit2;interfacetypeTDivision=Classpublicfile:/多态性让你的程序更据有“柔韧性”function GetDiv(Num1,Num2:Double):Double;overload;function GetDiv(Num1,Num2

14、:integer):integer;overload;end;implementation Division function TDivision.GetDiv(Num1, Num2: Double): Double;begintryResult:=Num1/Num2;exceptResult:=0;/提供弹形处理机制,处理除数为 0 情况end;end;function TDivision.GetDiv(Num1, Num2: integer): integer;begintryResult:=Num1 div Num2;exceptResult:=0;/提供弹形处理机制,处理除数为 0 情

15、况end;end;end.如上代码我们通过类的多态性机制把除法分别处理成整除和非整除,又通过异常处理屏去除数为 0 的情况,从而保证操作的安全性,在调用时,我们就可以这样来:usesunit2;$R *.dfmprocedure TForm1.Button1Click(Sender: TObject);varDivision:TDivision;IValue:integer;FValue:Double;beginDivision:=TDivision.Create;IValue:=Division.GetDiv(1,2);FValue:=Division.GetDiv(1.0,2);IValu

16、e:=Division.GetDiv(1,0);FValue:=Division.GetDiv(1.0,0);Division.Free;end;6.类是一种代码重用机制比方在 5 中我们想对这个类加上一个 GetAdd 函数来作加法运算就可以用类的继承。如下写就可以了:(一)unit Unit2;interfacetypeTDivision=Classpublicfunction GetDiv(Num1,Num2:Double):Double;overload;function GetDiv(Num1,Num2:integer):integer;overload;end;typeTOpera

17、tion=Class(TDivision)publicfunction GetAdd(Num1,Num2:Double):Double;end;implementation Division function TDivision.GetDiv(Num1, Num2: Double): Double;begintryResult:=Num1/Num2;exceptResult:=0;end;end;function TDivision.GetDiv(Num1, Num2: integer): integer;begintryResult:=Num1 div Num2;exceptResult:=0;end;end; TOperation function TOperation.GetAdd(Num1, Num2: Double): Double;beginResult:=Num1+Num2;end;end.这里我们从 TDivision 继承了一个子类 TOperation。TOperation 就可以即有 TDivsion公有方法 GetDiv,又有自己的独特的方法 GetAdd。这是类为我们提供的 “鱼和熊掌兼得”之法。不错吧。:)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报