当前位置:首页 > Windows程序 > 正文

delphi 基础之二 面向对象概念初步

2021-05-24 Windows程序

面向对象概念初步

1.类的定义

类的定义分两步:首先在类(单元)的接口(interface)部分说明这个方法.然后在实现部分(implementation)部分编写方法的实现代码.

定义:

type

类名=class(父类名)

数据域说明;      //类内部使用变量/常量的声明;

方法说明首部;

end;

实现代码:

procedure 类名.方法(参数);

实现代码;

end;

2.创建对象及对象成员的引用

创建对象分两步:

首先声明对象,语法格式为 var 类名;//此时对象名还只是个指针,没分配到内存。

然后调用create 分配内存 语法格式为  对象名:=类名.create。

对象中数据域(C++中的数据成员)和方法的引用 语法如下:

对象.数据域;

对象.方法;

释放对象 对象.free;

3.类的封装

类的每个成员都有一个称为可见性的属性,我们用下面的关键字之一来表示它:private、protected、 public、published 和 automated

类的的数据域(数据成员):

1)Fields  (字段)

字段就像属于对象的一个变量,它可以是任何类型,包括类类型 (也就是说,字段可以存储对象的引用)。 字段通常具有private 属性。

2)方法:

(1)方法的类型

对象的方法能定义成静态( static )、虚拟( virtual )、动态( dynamic)或消息处理(message )。

1. 静态方法

静态方法是方法的缺省类型,对它就像对通常的过程和函数那样调用。编译器知道这些方法的地址,所以调用一个静态方法时它能把运行信息静态地链接进可执行文件。 静态方法执行的速度最快,但它们却不能被覆盖来支持多态性。

2. 虚拟方法(v i r t u a l)

虚拟方法和静态方法的调用方式相同。由于虚拟方法能被覆盖,在代码中调用一个指定的虚拟方法时编译器并不知道它的地址。因此,编译器通过建立虚拟方法表 ( V M T )来查找在运行时的函数地址。所有的虚拟方法在运行时通过V M T来调度,一个对象的V M T表中除了自己定义的虚拟方法外,还有它的祖先的所有的虚拟方法,因此虚拟方法比动态方法用的内存要多,但它执行得比较快。(速度优化)

{虚拟方法还有一种特例,即抽象方法:例如

    procedure One;override;abstract;

在One方法后面,不但有override关键字,还多了一个abstract关键字(意为抽象)。这种方法称为抽象方法(在C++中称为纯虚拟函数)。含有抽象方法的类称为抽象类。抽象方法的独特之处在于,它只有声明,而根本没有实现部分,如果你企图调用一个对象的抽象方法,你将得到一个异常。只有当这个类的派生类重载并实现了该方法之后,它才能够被调用。(在C++中,甚至根本就不能建立一个抽象类的实例。)

既然如此,那么这种抽象方法又有什么用呢?

抽象方法本身不能够做任何事情,必须在子类中被重载并实现,才能够完成有意义的工作。但抽象方法的存在,相当于为父类留下了一个接口,当程序将一个子类的对象赋予父类的变量时,父类的变量就可以调用这个方法,当然此时它运行的是相应的子类中重载该方法的代码。如果没有这个抽象方法,父类的变量就不能调用它,因为它不能调用一个只在子类中存在、而在父类中不存在的方法!

3. 动态方法 (d y n a m i c)

动态方法跟虚拟方法基本相似,只是它们的调度系统不同。编译器为每一个动态方法指定一个独一无二的数字,用这个数字和动态方法的地址构造一个动态方法表 ( D M T )。不像V M T表,在D M T表中仅有它声明的动态方法,并且这个方法需要祖先的D M T表来访问它其余的动态方法。正因为这样,动态方法比虚拟方法用的内存要少,但执行起来较慢,因为有可能要到祖先对象的D M T中查找动态方法。(代码大小优化)

4. 消息处理方法 (message)

在关键字m e s s a g e后面的值指明了这个方法要响应的消息。用消息处理方法来响应windows的消息,这样就不用直接来调用它。。声明方法时,通过包含message指示字创建,并在message后面跟一个介于+1~49151之间的整数常量,体指定消息的号码(ID)。一个message方法必须具有一个单一var参数的过程。例

Typt

Ttextbox=class(Tcustomcontrol)

Private WMChar(var Message:TWMChar);message WM_CHAR;

Endl;

(2)方法的覆盖

在Object Pascal覆盖一个方法用来实现O O P的多态性概念。通过覆盖使一方法在不同的派生类间表现出不同的行为。Object Pascal 中能被覆盖的方法是在声明时被标识为v i r t u a l或d y n a m i c的方法。为 了覆盖一个方法,在派生类的声明中用o v e r r i d e代替v i r t u a l或d y n a m i c 。如果不含override关键字,如果子类声明和父类相同的方法,则视为新建。

T1=class

Procedure Draw;virtual;

End;

T2=calss(T1)

Procedure Draw;override;

End;

(3)方法的重载

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/70344.html