|
 |
栏目导栏 |
|
| |
|
|
|
|
 |
资料搜索 |
|
| |
|
|
|
|
 |
热门文章 |
|
| |
|
|
|
|
 |
最新文章 |
|
| |
|
|
|
| |
| |
|
|
|
|
前言:sgnLinux联盟 笔者曾经历过从面向过程的C,QBASIC,PASCAL语言到面向对象语言的过渡,也深知这小小的过度带来在思维或思想上转换的难度,因为面向对象的开发类语言是一个技术很多的平台,并不是简单的赋值,判断或循环,里面有许多图形开发平台自己的技术,这也是面向过程语言所不能比拟的,本文所有程序设计例程均由DELPHI中的OBJECT PASCAL语言进行描述。sgnLinux联盟 首先要说明的是,本文不是和大家讨论如何用可视化开发平台的IDE去设计程序的界面,也不用大篇幅的和大家讨论各个控件VCL的应用,不讨论如何用开发平台去完成一个MIDAS/ADO/DCOM数据库的开发过程,本文只和大家简单,肤浅的讨论面向对象语言的技术,和大家讨论面向对象语言内在的规则,面向对象语言的架构。sgnLinux联盟 随着程序设计开发环境革命性的改变,前由主要面向字符的DOS开发环境已经飞快的步入到WINDOWS图形可视化开发环境,随之而带来的是新的科技,新的技术。而各种不同的可视化开发环境平台也如雨后春笋一样,但这在众多的开发环境平台中也不乏大家科技企业出产的开发环境,比较有影响力的开发环境平台主要被VB,VC,PB,BCB,JAVA,DELPHI所占据,各种语言的优势与劣势不是本文所讨论的内容之一!但我还是选择了DELPH,因为DELPHI有许多的技术特点吸引了我,首先DELPHI其内的编译器的速度是全世界第一的,而且对日常的编程效率占有了很大的优势,还有其封装了的VCL可视化控件库,使在设计程序界面的过程中起了非常简便的作用,不在使界面设计成为头痛的问题,DELPHI对底层的操作也非常优秀,支持底层汇编,使底层高级应用能在DELPHI环境中轻易的实现,这是对开发多媒体,图形设计底层的程序员最大的福音,DELPHI对WIN32 API的封装一样做的非常优秀,其使用WIN32 API最大的优势是不用像在VB等其它语言中进行DLL文件的声明而直接使用, DELPHI对DATABASE数据库的支持也非常的优秀,甚至是世界上最好的数据库开发平台,我想这也是许多DELPHI爱好者们学习此语言的主要目标,小到本地,中到C/S服务器客户端,大到分布式多层应用,MIS企业信息管理,DELPHI AND CGI(公共网关接口),DELPHI AND ASP,ISAPI扩充因特网信息服务,WEB DATABASE网络数据库都有DELPHI程序设计师们的身影,支持XML扩展标记语言是DELPHI最大的卖点,因为这使其在INTERNET开发上迈出了重重的一步,而且DELPHI自身专利技术MIDAS多层分布式应用程序组也对高级数据库开发进行了非常好的支持,其对完成项目的成功率远远高于微软公司支持的COM+/COM技术,这一技术也是当今微软要在新版的开发环境平台中进行复制的技术,此技术也是未来数据库开发主流方向,即分布式多层应用,DELPHI对微软的ADO技术支持也非常的好,并特为此封装成ADO控件集,对开发ADO的数据库应用程序进行了效率上的提高,并对项目整体的工作进程有了一定的把握,DELPHI对数据库管理系统也具有非常好的支持,SQL SERVER,SYBAS,ORACLE等数据库管理系统大家企业都有对其进行单独书写的数据库驱动程序,并对效率上进行了非常多的改进,这也是DELPHI特点所在,其实作为DELPHI成功的地方远远不止如此,现在DELPHI8正要新鲜出炉,也希望DELPHI.NET做得更加优秀。sgnLinux联盟 笔者在面向对象的技术上还需要进一步的学习的地方,希望能和大家一同进步。sgnLinux联盟 正文:sgnLinux联盟 1. 面向对象程序设计思想――sgnLinux联盟 1.0.1 类的概念:sgnLinux联盟 面向对象高级语言――如果您是一位初学此类语言的朋友,一定会挠着头莫明的感到奇怪,到底什么是"面向对象"?这个"对象"是什么概念?下面我们一起来讨论一下。说到对象,我们先说一说Pascal语言中Record记录这个概念(其相当于C语言中的结构类型),Record记录在Pascal语言中是一种数据类型,是由几个域构成的一个整体,在Delphi开发环境中表示形式为:sgnLinux联盟 typesgnLinux联盟 yourrecord=recordsgnLinux联盟 yourint:integer;sgnLinux联盟 yourstring:string;sgnLinux联盟 yourreal:real;sgnLinux联盟 yourboolean:boolean;sgnLinux联盟 end;sgnLinux联盟 Pascal语言中的Record类型表示形式<框一>sgnLinux联盟 sgnLinux联盟 但在Delphi开发环境中增加了Class类类型,是面向对象程序设计的基础所在,类是对一类事务的抽象。在Delphi开发环境中表示形式为:sgnLinux联盟 typesgnLinux联盟 TForm1 = class(TForm)sgnLinux联盟 Button1: TButton;sgnLinux联盟 Edit1: TEdit;sgnLinux联盟 Memo1: TMemo;sgnLinux联盟 CheckBox1: TCheckBox;sgnLinux联盟 procedure Button1Click(Sender: TObject);sgnLinux联盟 procedure Edit1Click(Sender: TObject);sgnLinux联盟 procedure Edit1DblClick(Sender: TObject);sgnLinux联盟 procedure Memo1DragDrop(Sender, Source: TObject; X, Y: Integer);sgnLinux联盟 procedure Memo1Exit(Sender: TObject);sgnLinux联盟 procedure CheckBox1EndDock(Sender, Target: TObject; X, Y: Integer);sgnLinux联盟 procedure CheckBox1MouseDown(Sender: TObject; Button: TMouseButton;sgnLinux联盟 Shift: TShiftState; X, Y: Integer);sgnLinux联盟 privatesgnLinux联盟 { Private declarations }sgnLinux联盟 publicsgnLinux联盟 { Public declarations }sgnLinux联盟 end;sgnLinux联盟 Pascal语言中的Class类型表示形式<框二>sgnLinux联盟 sgnLinux联盟 我们可以看到,在DELPHI中的结构类型和类类型主要的区别是在类类型中多了过程,如果过程和函数作为类的成员,可用面向对象的术语:方法(method)来称呼它们。类中的变量,属性,方法称为类的成员。而在类类型中包含的Private,Public标识符我们在下文要详细讨论。在DELPHI中类类型是面象对象的程序设计的基础,以后大部分的程序设计都要和类类型进行接触,掌握好类的概念对以后的进一步学习和提高将有所帮助。sgnLinux联盟 类是对一类事物的抽象。sgnLinux联盟 1.0.2 对象的概念sgnLinux联盟 在DELPHI程序设计中对待"对象"的概念应该如同生活中对自己爱慕的人一样的重要,在以后的整个开发流程中,"对象"贯穿了整个工程体系的结构,在DELPHI里,新建一个工程,没有添加任何的代码,系统就已经为你创建了一个TForm1类类型,这足以说明对象和类在DELPHI中,以至于在面向对象程序设计中的重要地位。TForm1 = class(TForm);这段代码取自框二,意思是TForm1是TForm的一个"子类",TForm1拥有父类TForm的所有特性,类类型像记录类型一样,如果要使用它,就得实例化,来得到这个类的一个对象:sgnLinux联盟 VAR Form1:TForm1;sgnLinux联盟 从上面的讨论中我们得知"对象"即为一个"类"的"实例",该"实例"拥有类中的所有特性,我们再举个例子来说明一下:sgnLinux联盟 typesgnLinux联盟 TYourClass=classsgnLinux联盟 yourstring:string;sgnLinux联盟 yourinteger:integer;sgnLinux联盟 yourreal:real;sgnLinux联盟 yourcolor:Tcolor;sgnLinux联盟 yourcaption:tcaption;sgnLinux联盟 end;sgnLinux联盟 sgnLinux联盟 上面我们写了一个没有方法的类,类的名字是TYourClass,类中包含有五个成员,下一步我们要把TYourClass实例化来取得一个该类的一个对象:sgnLinux联盟 VARsgnLinux联盟 Yourinstance: TyourClass;sgnLinux联盟 代码书写完毕后实例Yourinstance即拥有了类TyourClass的所有特性,即也拥有了访问五个成员的特性,我们再进一步来对Yourinstance进行操作,整体的代码如下:sgnLinux联盟 varsgnLinux联盟 yourinstance:TYourclass;sgnLinux联盟 beginsgnLinux联盟 yourinstance:=TYourclass.create;sgnLinux联盟 yourinstance.yourstring:='123456789';sgnLinux联盟 yourinstance.yourinteger:=123456789;sgnLinux联盟 yourinstance.yourreal:=12.3;sgnLinux联盟 yourinstance.yourcolor:=clred;sgnLinux联盟 yourinstance.yourcaption:='very good!!';sgnLinux联盟 yourinstance.free;sgnLinux联盟 end;sgnLinux联盟 这样操作后,实例yourinstance拥有了Tyourclass类的所有特性具体的值,也许您会问道,在Tyourclass类中没有create和free方法,那是怎么出现的呢?这就与面向对象的基本特性"继承"有联系了,我们翻看以前的代码:TForm1 = class(TForm);这说明TForm1是TForm的一个子类,那TYourClass=class呢?在DELPHI中规定,所有的类都是继承自根类TObject中,查看DELPHI的源码我们发现sgnLinux联盟 TObject = classsgnLinux联盟 constructor Create;sgnLinux联盟 procedure Free;sgnLinux联盟 … …sgnLinux联盟 在Tobject中的确有方法名为create和free的,这说明:在DELPHI中继承自某一个类,那么该类的所有的特性都将被子类所默认拥有,而不必再次声明。sgnLinux联盟 TYourClass=class(tobject) 等价于 TYourClass=classsgnLinux联盟 所以如果不加(类名),意思是默认继承自tobject类。上面我们讨论了在DELPHI中所有的类的根类是Tobject,那么Tyourclass类的根类也是Tobject类,自然也拥有了Tobject类的所有特性。此节简单地讨论了对象的基本概念,也进一步讨论了类的高级概念。sgnLinux联盟 "对象"即为一个"类"的"实例"。sgnLinux联盟 1.0.3 Delphi工程文件和单元文件的结构sgnLinux联盟 在Delphi中工程文件是一个应用程序的主文件,而单元文件相当于辅文件。sgnLinux联盟 program Project1; {1,工程文件名}sgnLinux联盟 sgnLinux联盟 usessgnLinux联盟 Forms,sgnLinux联盟 Unit1 in 'Unit1.pas' {Form1}; {2,链接单元名}sgnLinux联盟 sgnLinux联盟 {$R *.RES} {3,链接资源名}sgnLinux联盟 sgnLinux联盟 beginsgnLinux联盟 Application.Initialize;sgnLinux联盟 Application.CreateForm(TForm1, Form1);sgnLinux联盟 Application.Run;sgnLinux联盟 end. {4,初始化,创建,运行部分}sgnLinux联盟 sgnLinux联盟 Delphi中的工程文件<框三>sgnLinux联盟 sgnLinux联盟 Delphi中的工程文件分成四个部分,DELPHI设计的程序运行时首先进入到工程文件中进行一系列的操作,主要在第四部分中产生窗体,然后运行,后到DELPHI的单元文件中进行操作。sgnLinux联盟 unit Unit1;sgnLinux联盟 interfacesgnLinux联盟 usessgnLinux联盟 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;sgnLinux联盟 typesgnLinux联盟 TForm1 = class(TForm)sgnLinux联盟 Private{私有成员}sgnLinux联盟 Protected{保护成员}sgnLinux联盟 Public{公有成员}sgnLinux联盟 Published{发行成员}sgnLinux联盟 end;sgnLinux联盟 varsgnLinux联盟 Form1: TForm1;sgnLinux联盟 implementationsgnLinux联盟 {$R *.DFM}sgnLinux联盟 end.sgnLinux联盟 sgnLinux联盟 Delphi中的单元文件<框四>sgnLinux联盟 sgnLinux联盟 程序从工程文件转到单元文件后,链接需要的其它的单元文件(uses部分),然后声明一个父类为TForm的TForm1类,再在implementation部分中进行生成可执行文件的步骤。我们以后要写的程序代码大部分都要写在单元文件中,以后对单元文件的操作最频繁的,单元文件的具体结构不是本文讨论的范畴,请参考其它相关书籍。sgnLinux联盟 1.0.4 Object Pascal语言的基本语法sgnLinux联盟 面向对象的PASCAL语言继承了PASCAL语法许多的优点,语法的严谨性是此语言最大的卖点,这个优点使在开发大型的应用程序时的效率问题得到了解决,也使应用程序在后期的升级得到了方便,不至于像在C类的语言中出现的莫明其妙的语法错误。sgnLinux联盟 严谨性是Object Pascal语言的特点。sgnLinux联盟 1.0.4.1 Object Pascal基本概念sgnLinux联盟 如果要把Object Pascal语言全部的语法描述出来,用一本书来讨论也不足为奇,我们就把基本的类型来和大家讨论一下,具体的技术问题请参考PASCAL语言方面的技术书籍。sgnLinux联盟 在Object Pascal中,数据类型也同其它语言一样十分的丰富,甚至有的类型对程序开发的简便性比其它的语言有过之的地方。sgnLinux联盟 在Object Pascal语言中不区别大小写,这是有别于C类语言的。sgnLinux联盟 标识符是以字母或下划线开头的字母,数字序列。sgnLinux联盟 关键字也称保留字,它是Object Pascal语言系统本身定义的,作为特殊用途的符号,不能用作他用。sgnLinux联盟 在Object Pascal语言中字符串变量的存在大大减少了对字符串操作的复杂性,这点是C类语言的弱处,如果在C类的语言中声明一个"字符串变量"就得用数组来做,不仅操作麻烦,而且代码维护的成本大大的提高,字符串类型的标识符为string,字符串变量在Object Pascal语言的声明:sgnLinux联盟 VAR yourstring:string;sgnLinux联盟 这样就可以操作yourstring这个变量了,对它进行赋值的操作:sgnLinux联盟 yourstring:='very good'; 注:字符串表示用单引号!sgnLinux联盟 Object Pascal语言中赋值的操作的格式是: 变量名:=操作数; 这点有别于其它的语言。上面的例子可以引申为变量的声明格式:sgnLinux联盟 Var 变量名:类型标识符;sgnLinux联盟 在Object Pascal语言中支持多种的整数类型,它们的类型标识符为integer,shortint,smallint,longint,int64,byte,word,longword,cardinal,不同的整数类型有不同的取值范围,我们这里只取最常用的类型integer整数类型,具体的取值范围请参考pascal书籍。sgnLinux联盟 字符类型在Object Pascal语言中用char标识符来表示,用于保存单个的字符。sgnLinux联盟 标准的布尔类型的标识符为boolean,布尔类型的值只有两个取值:true和false。sgnLinux联盟 在Object Pascal语言中也支持多种不同的实数类型,如real,single,double extended,comp,currency,同整数类型一样,不同的实数类型取值的范围也不尽相同。sgnLinux联盟 变量常量在Object Pascal语言中声明格式为:sgnLinux联盟 常量说明:sgnLinux联盟 const 常量标识符1=常量1;sgnLinux联盟 ……sgnLinux联盟 常量标识符n=常量n;sgnLinux联盟 常量说明例:sgnLinux联盟 const min=0;sgnLinux联盟 man=100;sgnLinux联盟 变量说明:sgnLinux联盟 var <变量标识符1>,<变量标识符2>:<类型标识符>;sgnLinux联盟 ……sgnLinux联盟 <变量标识符n>,<变量标识符n>:<类型标识符>;sgnLinux联盟 变量说明例:sgnLinux联盟 var youvar:integer;sgnLinux联盟 a,b,c:string;sgnLinux联盟 d,e,f:real;sgnLinux联盟 算术运行符:+,-,*,/,div(整数除法运算)/mod(取余运算)。sgnLinux联盟 逻辑运算符:not,and,or,xor,shl,shr。sgnLinux联盟 关系运行符:=(相等),<>(不相等),<,.>,>=,<=。sgnLinux联盟 任何程序的内在语法大体都相似。sgnLinux联盟 1.0.5 类成员的可见性概念sgnLinux联盟 面向对象开发类语言都有这个特性,如果掌握好能融会贯通在各个面向对象可视化开发语言中,在c++中由为对这个特性表现的淋漓尽致,在像DELPHI这样的面向对象可视化开发源代码公开的平台里,学习高级的技术查看源代码是必不可少的,甚至是学习一个功能实现的必要步骤,但DELPHI又是由Object pascal语言开发完成的,所以理解这个特性对以后的学习是有益处的,也对DELPHI内部运行的机制了解的更加深入,同时此技术也是开发第三方控件的必备知识。本节讨论的框架取自框四。sgnLinux联盟 类成员的可见性类似藏猫猫的游戏。sgnLinux联盟 1.0.5.1 私有成员privatesgnLinux联盟 每个人都在内心深处有一些不为人所知的秘密,面向对象开发语言中的类也有这种特性。sgnLinux联盟 在框四中的private段中所声明的成员只能在本单元UNIT中被访问,在其它的单元中访问不到private段中的成员的数据,举个小例子:sgnLinux联盟 unit Unit1;sgnLinux联盟 interfacesgnLinux联盟 usessgnLinux联盟 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;sgnLinux联盟 typesgnLinux联盟 TForm1 = class(TForm)sgnLinux联盟 Private{私有成员}sgnLinux联盟 Yourvar:integer;sgnLinux联盟 Protected{保护成员}sgnLinux联盟 Public{公有成员}sgnLinux联盟 Published{发行成员}sgnLinux联盟 end;sgnLinux联盟 varsgnLinux联盟 Form1: TForm1;sgnLinux联盟 implementationsgnLinux联盟 {$R *.DFM}sgnLinux联盟 end.sgnLinux联盟 在上面的代码中的private段中我们声明了一个变量名为yourvar类型为integer的类成员,那么在这个单元中对yourvar所做的任何操作后的结果,只能在本单元中进行访问,如读,存等,在其它的单元中不能访问这个单元中的"秘密",就像别人不能探究你内心的秘密一样。这种特性使某些数据的安全性得到了保障,有利于程序的总体架构设计。sgnLinux联盟 Private是你内心深处的秘密,别人也不允许知道你的秘密。sgnLinux联盟 Private是类中的秘密,其它单元不允许访问这个类中的秘密。sgnLinux联盟 1.0.5.2 保护成员protectedsgnLinux联盟 下班后,你一定想和自己宝贝的孩子进行快乐的交流,让心灵的桥梁畅通无阻,那就是protected属性带给你的感觉。sgnLinux联盟 在类中的保护成员protected声明的成员可以被该类访问,也可以被继承自这个类的类(孩子类)所访问。sgnLinux联盟 Protected相对private来说受到的限制少一些。sgnLinux联盟 举个例子:sgnLinux联盟 本例子中包括一个工程文件,及二个单元文件。sgnLinux联盟 DELPH中的工程文件内容:sgnLinux联盟 program Project1;sgnLinux联盟 {$APPTYPE CONSOLE}sgnLinux联盟 usessgnLinux联盟 SysUtils,sgnLinux联盟 Unit1 in 'Unit1.pas',sgnLinux联盟 Unit2 in 'Unit2.pas';sgnLinux联盟 sgnLinux联盟 varsgnLinux联盟 newobject:tghyother;sgnLinux联盟 beginsgnLinux联盟 newobject:=tghyother.create;sgnLinux联盟 newobject.display;sgnLinux联盟 newobject.free;sgnLinux联盟 sgnLinux联盟 end.sgnLinux联盟 sgnLinux联盟 单元文件1的内容:sgnLinux联盟 unit Unit1;sgnLinux联盟 sgnLinux联盟 interfacesgnLinux联盟 typesgnLinux联盟 tghy=classsgnLinux联盟 protectedsgnLinux联盟 name:string;sgnLinux联盟 age:integer;sgnLinux联盟 publicsgnLinux联盟 constructor create;sgnLinux联盟 procedure display; virtual;sgnLinux联盟 end;sgnLinux联盟 sgnLinux联盟 implementationsgnLinux联盟 constructor tghy.create;sgnLinux联盟 beginsgnLinux联盟 end;sgnLinux联盟 procedure tghy.display;sgnLinux联盟 beginsgnLinux联盟 end;sgnLinux联盟 sgnLinux联盟 end.sgnLinux联盟 sgnLinux联盟 单元文件2的内容:sgnLinux联盟 unit Unit2;sgnLinux联盟 sgnLinux联盟 interfacesgnLinux联盟 uses unit1;sgnLinux联盟 typesgnLinux联盟 tghyother=class(tghy)sgnLinux联盟 protectedsgnLinux联盟 school:string;sgnLinux联盟 teacher:string;sgnLinux联盟 publicsgnLinux联盟 constructor create;sgnLinux联盟 procedure display;override;sgnLinux联盟 end;sgnLinux联盟 sgnLinux联盟 implementationsgnLinux联盟 constructor tghyother.create;sgnLinux联盟 beginsgnLinux联盟 inherited create;sgnLinux联盟 name:='gaohongyan';sgnLinux联盟 age:=23;sgnLinux联盟 school:='东北电力学院-电子商务系-2001级大专12班';sgnLinux联盟 teacher:='zhaolifei';sgnLinux联盟 end;sgnLinux联盟 sgnLinux联盟 procedure tghyother.display;sgnLinux联盟 beginsgnLinux联盟 writeln(name);sgnLinux联盟 writeln(age);sgnLinux联盟 writeln(school);sgnLinux联盟 writeln(teacher);sgnLinux联盟 end;sgnLinux联盟 sgnLinux联盟 end.sgnLinux联盟 sgnLinux联盟 当执行完这个程序后,屏幕上出现这个结果:sgnLinux联盟 gaohongyansgnLinux联盟 23sgnLinux联盟 东北电力学院-电子商务系-2001级大专12班sgnLinux联盟 zhaolifeisgnLinux联盟 我们结合上面的例子不难看出在unit1中声明的tghy类,在unit2中的tghyother是继承自tghy类的,是tghy类的一个"孩子",它们是父子关系,而在tghy类中的name,age成员是声明在protected保护成员中的,根据保护成员的特性,我们就可以在tghyother类的实例newobject中访问tghy中的成员内容了,如果把tghy类中的name,age声明在private私有成员中,那么是不可能被tghyother类的实例newobject所访问到的。sgnLinux联盟 请切记,每天下班后把你认为对孩子重要事情和他交流。sgnLinux联盟 如果要想让自己的派生类访问基类中的成员,声明在protected段中。sgnLinux联盟 1.0.5.3 公有成员publicsgnLinux联盟 每个人每天都会发生一些让自己感到快乐的事情,你会告诉你的家人,你的朋友,你愿意把这个快乐和大家一起分享,如果是这样的话,那就是public。sgnLinux联盟 公有成员Public是把要公开的信息发表出去的地方,你想把任何的消息让任何人知道,就通过public发布出去。通过把向外界提供服务功能放在此部分中,实现向外界提供服务。sgnLinux联盟 举个例子:sgnLinux联盟 新建一个工程,工程中包括一个工程文件,及一个单元文件。sgnLinux联盟 工程文件内容:sgnLinux联盟 program Project1;sgnLinux联盟 {$APPTYPE CONSOLE}sgnLinux联盟 usessgnLinux联盟 SysUtils,sgnLinux联盟 Unit1 in 'Unit1.pas',sgnLinux联盟 Unit2 in 'Unit2.pas';sgnLinux联盟 sgnLinux联盟 varsgnLinux联盟 newobject:tghy;sgnLinux联盟 beginsgnLinux联盟 newobject:=tghy.create;sgnLinux联盟 newobject.display;sgnLinux联盟 newobject.free;sgnLinux联盟 sgnLinux联盟 end.sgnLinux联盟 sgnLinux联盟 单元文件1内容:sgnLinux联盟 unit Unit1;sgnLinux联盟 sgnLinux联盟 interfacesgnLinux联盟 uses Dialogs;sgnLinux联盟 typesgnLinux联盟 tghy=classsgnLinux联盟 publicsgnLinux联盟 constructor create;sgnLinux联盟 procedure display; virtual;sgnLinux联盟 end;sgnLinux联盟 sgnLinux联盟 implementationsgnLinux联盟 constructor tghy.create;sgnLinux联盟 beginsgnLinux联盟 end;sgnLinux联盟 procedure tghy.display;sgnLinux联盟 beginsgnLinux联盟 writeln('this is public');sgnLinux联盟 end;sgnLinux联盟 sgnLinux联盟 end.sgnLinux联盟 程序运行后,屏幕上出现结果:sgnLinux联盟 this is publicsgnLinux联盟 通过上面的这个例子,我们知道在工程文件中声明一个tghy类的实例newobject能访问tghy类的public中的部分。通常一个类的方法就声明在public中,来为其类的实例进行任何的数据操作。sgnLinux联盟 请切记,把你每天快乐的事情告诉给你的家人,朋友。sgnLinux联盟 把你要发布的信息放到public中去,让大家都知道。sgnLinux联盟 1.0.5.4 发行成员publishedsgnLinux联盟 如果您十分的熟悉DELPHI的开发环境的话,那么属性编辑器一定是您最常用的工具了,里面显示了当前控件的属性,显示了当前控件的状态,里面显示的状态的内容就是声明在published里面的,我们可以参考一下delphi的源码:sgnLinux联盟 TControlScrollBar = class(TPersistent)sgnLinux联盟 publishedsgnLinux联盟 property ButtonSize: Integer read FButtonSize write SetButtonSize default 0;sgnLinux联盟 property Color: TColor read FColor write SetColor default clBtnHighlight;sgnLinux联盟 property Increment: TScrollBarInc read FIncrement write FIncrement stored IsIncrementStored default 8;sgnLinux联盟 property Margin: Word read FMargin write FMargin default 0;sgnLinux联盟 property ParentColor: Boolean read FParentColor write SetParentColor default True;sgnLinux联盟 property Position: Integer read FPosition write SetPosition default 0;sgnLinux联盟 property Range: Integer read FRange write SetRange stored IsRangeStored default 0;sgnLinux联盟 property Smooth: Boolean read FSmooth write FSmooth default False;sgnLinux联盟 property Size: Integer read FSize write SetSize default 0;sgnLinux联盟 property Style: TScrollBarStyle read FStyle write SetStyle default ssRegular;sgnLinux联盟 property ThumbSize: Integer read FThumbSize write SetThumbSize default 0;sgnLinux联盟 property Tracking: Boolean read FTracking write FTracking default False;sgnLinux联盟 property Visible: Boolean read FVisible write SetVisible default True;sgnLinux联盟 end; sgnLinux联盟 这是一个scrollbar控件在运行状态中反应在属性编辑器中显示的状态,是不是很眼熟?Object Pascal编译系统可以为类的发行成员产生运行时的信息(RTTI-RunTime Type Information),通过这些信息DELPHI就可以把在设计时期控件的状态显示在delphi中的属性编辑器中了。sgnLinux联盟 在开发第三方控件中发行成员的部分是非常重要的代码书写点。sgnLinux联盟 在你开发第三方控件时,把要在设计时的状态显示在属性编辑器中时,放在published段中是你正确的选择。sgnLinux联盟 1.0.5.5 继承sgnLinux联盟 也许您看了上面的代码后不明白一个概念,什么是继承?sgnLinux联盟 继承是面向对象语言的一个重要特性,通过继承使编程人员通过一个旧类的基础上来建立一个新类,而无需重新设计每一个类。这个新的类称为派生类,而已有的类称为基类。sgnLinux联盟 继承好比是:父母和子女的关系。sgnLinux联盟 我们在保护成员protected的例子中的tghyother就是一个派生类,tghy就是它的基类,tghyother是派生自tghy类的,tghy是tghyother的父母,tghyoher有tghy的方法和属性,tghy的方法和属性被tghyother所继承。sgnLinux联盟 如:sgnLinux联盟 typesgnLinux联盟 tghyother=class(tghy)sgnLinux联盟 protectedsgnLinux联盟 school:string;sgnLinux联盟 teacher:string;sgnLinux联盟 publicsgnLinux联盟 constructor create;sgnLinux联盟 procedure display;override;sgnLinux联盟 end;sgnLinux联盟 tghyother就是派生自tghy基类的。sgnLinux联盟 在delphi中继承也有自己的格式:sgnLinux联盟 type <派生类标识符>=class<基类标识符>sgnLinux联盟 派生类标识符是必写的内容,基类标识符是可写可不写的,如果不写基类标识符,那么系统默认派生类是从tobject类继承的,tobject类是所有类的父母,就是所有类的祖先。在delphi中类像dos中的目录管理方式一样,是以"树"形的结构来架构的。sgnLinux联盟 1.0.5.6 类的方法成员sgnLinux联盟 就像在一个家庭中每个孩子都有自己独特性格一样,在类中的方法中也有不同的种类。根据类方法提供的服务不同,分为静态方法,虚拟方法,可以说类的方法是面向对象语言的灵魂所在,把时间花在这方面一段时间过后会感觉到非常值得。sgnLinux联盟 1.0.5.6.1 静态方法sgnLinux联盟 默认的情况下,类方法成员就是静态的,意味着程序在编译阶段就可以确定方法的调用代码。sgnLinux联盟 例程:sgnLinux联盟 program Project1;sgnLinux联盟 {$APPTYPE CONSOLE}sgnLinux联盟 usessgnLinux联盟 SysUtils;sgnLinux联盟 sgnLinux联盟 type tghy=classsgnLinux联盟 procedure output;sgnLinux联盟 end;sgnLinux联盟 procedure tghy.output;sgnLinux联盟 beginsgnLinux联盟 writeln('tghy output');sgnLinux联盟 end;sgnLinux联盟 sgnLinux联盟 type tghyother=class(tghy)sgnLinux联盟 procedure output;sgnLinux联盟 end;sgnLinux联盟 procedure tghyother.output;sgnLinux联盟 beginsgnLinux联盟 writeln('tghyother output');sgnLinux联盟 end;sgnLinux联盟 varsgnLinux联盟 aa:tghy;sgnLinux联盟 bb:tghyother;sgnLinux联盟 beginsgnLinux联盟 aa:=tghy.create;sgnLinux联盟 aa.output;sgnLinux联盟 aa.free;sgnLinux联盟 sgnLinux联盟 bb:=tghyother.create;sgnLinux联盟 bb.output;sgnLinux联盟 bb.free;sgnLinux联盟 sgnLinux联盟 aa:=tghyother.create;sgnLinux联盟 aa.output;sgnLinux联盟 aa.free;sgnLinux联盟 sgnLinux联盟 end.sgnLinux联盟 程序输出结果为:sgnLinux联盟 tghy outputsgnLinux联盟 tghyother outputsgnLinux联盟 tghy outputsgnLinux联盟 由上面我们可以知道,在程序的编译时间就已经确定方法的调用代码,已经确定了调用机制。sgnLinux联盟 1.0.5.6.2 虚拟方法sgnLinux联盟 定义:在类层次关系结构中,如果基类定义的某一个方法成员由关键字virtual来标识,那么由关键字vitual标识的方法称为虚拟方法。sgnLinux联盟 在使用类实例调用虚拟方法时,程序动态确定需要调用的代码。根据规则的不同调用不同的代码。sgnLinux联盟 例程:sgnLinux联盟 program Project1;sgnLinux联盟 {$APPTYPE CONSOLE}sgnLinux联盟 usessgnLinux联盟 SysUtils;sgnLinux联盟 sgnLinux联盟 type tghy=classsgnLinux联盟 procedure output;virtual;sgnLinux联盟 end;sgnLinux联盟 procedure tghy.output;sgnLinux联盟 beginsgnLinux联盟 writeln('tghy output');sgnLinux联盟 end;sgnLinux联盟 sgnLinux联盟 type tghyother=class(tghy)sgnLinux联盟 procedure output;override;sgnLinux联盟 end;sgnLinux联盟 procedure tghyother.output;sgnLinux联盟 beginsgnLinux联盟 writeln('tghyother output');sgnLinux联盟 end;sgnLinux联盟 type tzssother=class(tghy)sgnLinux联盟 procedure output;override;sgnLinux联盟 end;sgnLinux联盟 procedure tzssother.output;sgnLinux联盟 beginsgnLinux联盟 writeln('tzssother output');sgnLinux联盟 end;sgnLinux联盟 varsgnLinux联盟 aa:tghy;sgnLinux联盟 bb:tghyother;sgnLinux联盟 cc:tzssother;sgnLinux联盟 beginsgnLinux联盟 bb:=tghyother.create;sgnLinux联盟 bb.output;sgnLinux联盟 bb.free;sgnLinux联盟 sgnLinux联盟 aa:=tghyother.create;sgnLinux联盟 aa.output;sgnLinux联盟 aa.free;sgnLinux联盟 sgnLinux联盟 cc:=tzssother.Create;sgnLinux联盟 cc.output;sgnLinux联盟 cc.free;sgnLinux联盟 sgnLinux联盟 aa:=tzssother.create;sgnLinux联盟 aa.output;sgnLinux联盟 aa.free;sgnLinux联盟 sgnLinux联盟 end.sgnLinux联盟 程序输出结果为:sgnLinux联盟 tghyother outputsgnLinux联盟 tghyother outputsgnLinux联盟 tzssother outputsgnLinux联盟 tzssother outputsgnLinux联盟 在类层次中,如果仅仅在基类的虚拟方法后使用了关键字virtual,而在派生类的相应方法后没有使用override关键字,则在程序调用此方法时,编译器仍然使用静态联编的规则来调用代码。sgnLinux联盟 结语sgnLinux联盟 面向对象程序设计开发不同于面向过程,里面有许多新鲜的技术,就其本质来说的确为程序设计的发展提供了一个良好的平台,使超大规模项目的管理得到很好的改良,也简化了程序设计的过程,最主要的是改变了程序设计的思想模式,这点对软件事业的作用是非常重要的。sgnLinux联盟 自己写的技术讨论眼看就要收工了,真有些怀念起这段时间,自己也通过这个机会得到了提高,也很高兴的能看到其它同学的技术文章,也希望学校能多组织开展这方面的活动,让我们有一些学习的机会,有一个发挥的舞台。sgnLinux联盟 面向对象程序设计不同于面向过程,面向对象编程,理论的实践。sgnLinux联盟
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论 |
|
|
|
|
|