《Delphi软件开发技术 教学课件 ppt 作者 张世明P1》由会员分享,可在线阅读,更多相关《Delphi软件开发技术 教学课件 ppt 作者 张世明P1(237页珍藏版)》请在金锄头文库上搜索。
1、第1章 面向对象程序设计,Delphi软件开发技术,面向对象(简称OO)的程序设计方法是一种以模拟真实世界的概念来组织程序的全新方法,它与传统的结构化程序设计方法有着明显的不同。,能够支持面向对象程序设计的语言称之为OOPL,面向对象的Pascal(Object Pascal)就是一种OOPL。,Object Pascal扩展了Pascal的功能,引入了面向对象的封装、继承、多态等概念。,1.1 面向对象程序设计概念 1.2 类 1.3 方法 1.4 继承和多态 1.5 对象 1.6 属性 1.7 消息,1.1 面向对象程序设计概念,面向对象的程序设计方法中,把个体命名为对象,把个性命名为数据
2、或者属性,把行为称为方法。,1.1.1 结构化程序设计方法,传统Pascal支持结构化的程序设计方法,这种程序设计的方法着重于分析应用程序所要实现的功能,根据要解决的问题和程序的功能设计数据结构。,分析实际问题时,根据数据流的变化和输入输出划分模块,根据程序功能编写过程。,1.1.2 面向对象的设计方法,尽管OOP并不能使代码容易编写,但它使代码容易维护。通过把数据和代码封装在一起,大大简化了定位和修复错误的工作,并最大限度地减少对其他对象的影响。,面向对象的设计方法强调将行为个体对象化,将对象的数据和操作封装在一起,,对于一个对象而言,内部数据的更改完全由自己调用操作完成,数据变为对象之后,
3、,它就有活动能力,可以主动的表现自己,修改自己,与其他对象联系。,面向对象的三大特点:封装性、继承性、多态性。,1封装性 类除了包含数据以外,还包含了操纵数据的方法。,类把数据和方法封装在一起,同时隐藏了实现的细节,这样有利于程序的模块化,减少被其他代码干扰的机会。,2继承性 一个对象能够从它的祖先那里获取已有的成员和行为。,这样,要创建多层次对象,你可以先创建一个通用的对象,然后派生出新的对象。,继承的好处是可以共享已有的代码。,被继承的类称为基类,继承下来的类称为派生类,基类的成员自动成为派生类的成员。,类的继承具有传递性。TObject是一个最基本的类,从它派生出了大量形形色色的其他类。
4、,3多态性 当调用一个对象的方法时,实际被调用的代码与对象的实例有关。,1.1.3 面向对象程序设计的概念,一、基本概念 类:类描述了具有相似性质的一组对象。,这组对象具有相同的数据结构,相同的操作。,在Object Pascal中类是一种数据结构,定义了该组对象的共同属性和操作。,对象:数据和代码封装的统一体。对象与实例的概念等同,实例从类的角度定义对象,表示一个建立在特定类的基础上的对象。,对象也可以理解为一个数据和代码封装的变量,而类便定义了这个变量的数据类型。,属性:它是对对象数据概念的扩展。,类的属性,不仅仅是用来赋值和引用的,类可以提供保护方法,使访问对应的对象数据时能够支持自动转
5、换。,方法:类所提供的操作,可以是过程,也可以是函数。对象可以使用方法以实现对象的操作。,二、初步介绍,对象可以被创建,也可被释放。创建对象时要使用对象所属类的构造方法。,对象在创建的时候,要进行对象中数据的初始化工作。,如果一个对象所属的类是从其它类继承来的,那么该对象还享有祖先类的属性和方法。,类要定义公共的属性和方法,根据它创建的对象都可以拥有这些属性,并可使用这些方法。,如果有一个类,是其它类的父类,但是它不能创建对象,则称之为抽象类。,抽象类就是给相似的类提供一个接口,再定义一些公共的东西。为了实现多态,定义抽象类的方法适用于接口定义。,根据继承的关系,类有父类、子类、祖先类、后代类
6、的区分。TObject就是一个抽象类。,属性可暂先理解为数据域。数据域可以设置三种保护方法,只允许自己类内访问的私有型,允许所有对象访问的公有型,允许自己的子类访问的保护型。,属性还可以有读写设置,可以设置为只读的,只写的,可读可写的。,读的时候可以直接读数据,也可以通过子程序转化一下,写也可以有不同方法。,方法就是类的操作。构造方法是类创建对象的方法,析构方法是释放变量的方法,方法可以是函数或过程,也有三种保护方式。,1.2 类,可以认为类就是对象Pascal的一个数据类型。类的概念就是抓住对象的相似性,定义它们的共同特征,包括数据和操作。,1.2.1 类的定义,在Object Pascal
7、中类被当作一个数据类型来定义,它的语法是:,type 类名=class(父类) 数据域定义 过程和函数定义 属性的定义,End; 如果不声明父类,Delphi自动从TObject继承,TObject是所有类的最终祖先。,1.2.2 保护方式,Object Pascal有四种类元素的保护方式,类元素包括数据域和方法。,这四种保护方式为Published(可视),Public(公有),Protected(保护),Private(私有)。,加上类的保护指令,类定义的语法可改进为:,Type 类名=class(父类) Public 类元素定义 Protected 类元素定义 Private 类元素定义
8、 Published 类元素定义 end;,1.private 被声明的类元素仅在该类的方法中被访问,它的子类和实例都无法访问。,2.protected 被声明的类元素在该类的方法中可被访问,它的子类和后代类也可访问,除此以外都无法访问。,3.public 完全可访问。,4.Published 它的访问权限基本与public相同,只是在设计期间也可以被访问。,除了在类封装的时候可以限制成员的访问权限外,也可以限制对变量、对象、函数和过程等的访问权限。,为了使软件系统具有良好的安全性、健壮性,应该注意这些限制权限的用法。,1.2.3 类实例化,定义了类之后,必须对类内的方法进行实现。,在单元的实
9、现部分,不必按照定义的顺序,但是必须按照格式“Procedure(或Function) 类名.方法(参数表)”来做。,类的实例化就是利用类的方法创建对象,如果是缺省从TObject处继承来的类,它的祖先从未定义过构造方法,那么直接使用如下形式创建:,var 对象变量名:类名; 对象变量名:=类名.create; 或者: 对象变量名:=类名.构造方法名(参数表);,1.2.4 类操作符,1类型判断操作符is Delphi提供运算符is来测试一个类是否和另一个类相容,即左操作数是否是右操作数的同类或子类。语法形式为:,对象名 is 类名 在Windows程序设计中常用此运算判断组件的类型,如:,F
10、or i:=0 to ComponentCount-1 do if Componentsi is TEdit then TEdit(Componentsi).Text:=;,将该程序段放于FormShow事件中,可清除所有窗体内的输入框文本。,2类型强制转化as 在上例中已用到了强制转化。判断出组件的类型是TEdit后,强制将组件转化为TEdit,然后进行Text属性的赋值操作。这种强制转化同As的强制转化是有区别的:,Componentsi As Edit相当于 if Componentsi is TEdit then TEdit(Componentsi) Else raise EInval
11、idCast.Create;,As进行类型强制转化时首先测试,然后进行转化,转化不成功,则引起异常EInvalidCast。,3类指针 类指针即是指向类的指针,不是指向对象的指针,定义类指针类型和类指针变量的格式如下:,type 类指针类型=class of 类名; var 类指针变量名:类指针类型;,1.3 方法,方法是在类中定义,用来实现对象操作的过程或者函数。,Delphi中有四类方法:一般方法、构造方法、析构方法、类方法。,1.3.1 一般方法,此类方法是在类内定义,单元内实现,可以是过程,也可以是函数。,方法是类元素,通过设置保护方式,也可确定它的调用范围。定义一般方法的语法如下:,
12、type 类名=class(父类) 保护方式关键字(public或private) Procedure 方法名(参数表); Function方法名(参数表):返值类型; End;,实现一个方法的语法如下: Procedure 类名.方法名(参数表); Function 类名.方法名(参数表):返值类型; 常量,变量等定义 begin 执行语句 end;,调用一个方法的语法格式如下: 对象实例.方法名(实际参数); 一般方法的实现与子程序的实现在形式上的差别是方法名前面要加上类名的限定。,1.3.2 构造方法,构造方法用来创建类的对象实例,并且对对象的数据域进行初始化,构造方法有时被称为是构造函
13、数,因为它返回的是一个类的对象实例指针。,构造方法很象一般方法,只是将Procedure换成关键字Constructor。构造方法的语法格式如下:,type 类名=class(父类) constructor 构造方法名(参数表); End;,实现构造方法的语法如下: constructor 类名.构造方法名(参数表);,调用构造方法创建对象实例的语法如下: 对象实例变量名.构造方法名(参数表);,构造方法创建类的对象实例,创建后返回实例指针,但在代码中不必给返回值赋值。,构造方法除了继承父类的构造方法外,一般还创建其它数据结构,还要对类的所有数据域进行初始化。,1.3.3 析构方法,析构方法用
14、来释放类的对象实例,并且释放对象中的其他数据结构。通常的情况下,一个类只有一个析构方法Destroy。,这个析构方法不带任何参数,带参数的析构方法很少,因为目标明确,就是关闭、释放。析构方法的语法格式如下:,type 类名=class(父类) destructor 析构方法名(参数表); end;,实现析构方法时按照如下语法: destructor 类名.析构方法名(参数表);,调用析构方法的语法如下。(一般不直接调用析构方法): 对象实例变量名.析构方法名(参数表);,析构方法不是必须的,只有在构造方法中分配了内存、使用了资源、打开了文件、数据库,此时才需要析构方法去做善后工作。析构方法De
15、stroy在实现时要注意三点:,(1)类结构内声明时用destructor destroy;override;,(2)实现析构方法时按照如下格式,继承父类的析构方法(inherited destroy)应放在最后。,destructor classname.destroy; Begin 释放,关闭 inherited destroy; End;,(3)不要在程序中调用Destroy来释放对象,而应该用Free。Free在释放之前会检测对象是否为nil,如果不为nil才释放对象变量。,1.3.4 类方法,普通方法只能被对象实例来调用,而类方法既可被对象实例调用,也可被类本身引用。,类方法只是表明
16、这个方法在逻辑上与这个类有联系。类方法在类结构中定义,与普通方法的区别就是在Procedure或者Function之前加一个Class。,要考虑到在类方法中使用类名调用时,各数据域都未创建,因此在类方法内,不允许访问类的数据域。实现类方法时按照如下语法:,class procedure(或function) 类名.类方法名(参数表);,调用类方法的语法如下: 类名.类方法名(参数表); 或者: 对象实例变量名.类方法名(参数表);,最典型的类方法就是TObject的方法ClassInfo、ClassName、ClassParent、InheritsFrom、InstanceSize、MethodAddress、MethodName。;,这些方法提供了关于该类和对象实例的有用信息。如ClassName是按照如下方式定义的