今天我们来简单介绍一下Object Pascal的方法。
和其他语言一样,Object Pascal语言的方法是属于一个给定对象的过程和函数。构造器和析构函数也是方法。
一、方法的类型
方法的类型包括静态(static)、虚拟(virtual)、动态(dynamic)或消息处理(message)。
1.1 静态方法
procedure IAmAStatic;
IAmAStatic是一个静态方法,静态方法是方法的缺省类型,调用静态方法时能把运行信息静态地链接进可执行文件。其执行速度最快,但不能被覆盖来支持多态性。
1.2 虚拟方法
procedure IAmAVirtual; virtual;
虚拟方法和静态方法的调用方式相同。
1.3 动态方法
procedure IAmADynamic; dynamic;
1.4 消息处理
procedure IAmAMessage(var M : TMessage); message wm_SomeMessage;
1.5 方法覆盖
在Object Pascal中能被覆盖的方法是在声明时被标识为virtual 或dynamic的方法
TFooChild = class(TFoo)
procedure IAmAVirtual; override;
procedure IAmADynamic; override;
procedure IAmAMessage(var M: TMessage); message wm_SomeMessage;
end;
1.6 方法的重载
overload:能使用相同的名称在一个作用域声明多个例程,并且有不同的参数列表;必须以参数的个数或类型加以区分。例如:
Type
TSomeClass = class
procedure Amethod(I:integer); overload;
procedure Amethod(S:string); overload;
procedure Amethod(D:double); overload;
end;
1.7 重新引入方法名称
重新引入方法的名称的使用前提是在派生类中声明的方法名与父类的某个方法名称相同。在派生类中使用reintroduce指示符
Type
TSomeBase = class
Procedure A;
end;
TSomeClass = class
Procedure A; reintroduce;
end;
1.8 self
Self:在所有对象的方法中的一个隐含变量,用来调用方法的指向类实例的指针。
1.9 方法的嵌套
procedure DoSomething(S: string);
var
X,Y: Integer;
procedure NestedProc(S: string);
begin
...
end;
begin
...
NestedProc(S);
...
end;
2. 调用约定
调用约定决定了参数被传递给例程的顺序。默认约定为register。
register、pascal:调用从左到右传递参数;cdecl、stdcall、safecall从右到左传递参数;register使用寄存器传递数据。访问公共属性的方法必须使用register;调用c或C++编写的公共类库时,要使用cdecl;例如:
function MyFunction(X,Y : Real): Real;cdecl;
3. Forward
用Forward取代例程块(包括局部变量声明和语句)。其目的是为了将函数或过程在其实际定义前能被使用。例如:
funciton Caiculate(X,Y: Integer) : Real; forward;
4.External
External指示字允许你调用和程序分开编译的例程。当导入一个带有可变数目参数的C++函数时,要使用varags指示子。例如:
function printf(Format: PChar): Integer; cdecl;varargs;
链接目标文件要调用目标文件中的例程,首先要使用$L编译器指示字把目标文件链接到你的程序中。例如:
procedure MoveWord(var Source,Dest;Count: Integer); external;
在window下动态导入函数。
function SomeFunction(S: string): string exteranl 'strlib.dll';
对于动态导入的库,其名称可以和库中的名称不同。如这样做,则需要用external指定其原始名称。例如:
function MessageBox(HWind: Integer;Text,Caption: PChar; Flags: Integer): Integer;stdcall;external 'user32.dll' name 'MessageBoxA';
5. 参数
5.1 参数分类:value(数值参数)、variable(变量参数)、constant(常量参数)或out(out参数)。默认为value。关键字为var(变量参数)、const(常量参数)、out(out参数);
5.2 数值参数和变量参数
数值参数通过数值传递,变量参数通过引用传递(就相当于把变量当做一个指针来进行传递)。
5.3 out参数
out参数只是为了输出,即告诉函数或过程在哪里存储输出,但不提供输入。例如:
procedure GetInfo(out info:SomeRecordType);
当你使用GetInfo时,你必须传递一个SomeRecordType类型的变量,例如:
var MyRecord: SomeRecordType;
...
GetInfo(MyRecord);
out参数经常用在分布式对象模型中,而且当向函数或过程传递未初始化的变量时,应使用out参数。
5.4 开放数组参数
function Find(A: array of Char): Integer;
5.5 默认参数
有默认值的参数,必须出现在参数列表的最后。