和其他语言一样,Object Pascal语言的方法是属于一个给定对象的过程和函数。构造器和析构函数也是方法。
一、方法的类型
方法的类型包括静态(static)、虚拟(virtual)、动态(dynamic)或消息处理(message)。
1.1 静态方法 procedure 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的方法
1.6 方法的重载overload:能使用相同的名称在一个作用域声明多个例程,并且有不同的参数列表;必须以参数的个数或类型加以区分。
(C++和JAVA中的函数重载不需要overload声明, 注意重载只能形参不一样,返回值必须一样)
Type
TSomeClass = class
procedure Amethod(I:integer); overload;
procedure Amethod(S:string); overload;
procedure Amethod(D:double); overload;
end;
重新引入方法名称
重新引入方法的名称的使用前提是在派生类中声明的方法名与父类的某个方法名称相同。在派生类中使用reintroduce指示符
或者子类可以重写父类的函数,但是父类必须声明为virtual或者dynamic
Type
TSomeBase = class
Procedure A;
end;
TSomeClass = class
Procedure A; reintroduce;
end;
1.8 self
Self:在所有对象的方法中的一个隐含变量,用来调用方法的指向类实例的指针。(JAVA中也是Self,C++中用this指针)
1.9 方法的嵌套procedure DoSomething(S: string);
var
X,Y: Integer;
procedure NestedProc(S: string);
begin
...
end;
begin
...
NestedProc(S);
...
end;
2. 调用约定(这个在C++反汇编中已经了解了)
调用约定决定了参数被传递给例程的顺序。默认约定为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编译器指示字把目标文件链接到你的程序中(C++中的静态链接,lib文件)。例如:
procedure MoveWord(var Source,Dest;Count: Integer); external;
在window下动态导入函数。
对于动态导入的库,其名称可以和库中的名称不同。如这样做,则需要用external指定其原始名称。例如:function SomeFunction(S: string): string exteranl 'strlib.dll';
function MessageBox(HWind: Integer;Text,Caption: PChar; Flags: Integer): Integer;stdcall;external 'user32.dll' name
5. 参数
5.1 参数分类:value(数值参数)、variable(变量参数)、constant(常量参数)或out(out参数)。默认为value。关键字为var(变量参数)、const(常量参数)、out(out参数);
5.2 数值参数和变量参数
数值参数通过数值传递,变量参数通过引用传递(就相当于把变量当做一个指针来进行传递 类似于C++的引用&)。
5.3 out参数
out参数只是为了输出,即告诉函数或过程在哪里存储输出,但不提供输入。
在声明和定义函数时候在参数前加上变量关键字
procedure GetInfo(out info:SomeRecordType);
当使用这个GetInfo时,你必须传递一个SomeRecordType类型的变量
out参数经常用在分布式对象模型中,而且当向函数或过程传递未初始化的变量时,应使用out参数。var MyRecord: SomeRecordType; ... GetInfo(MyRecord);
5.4 开放数组参数
function Find(A: array of Char): Integer;
5.5 默认参数
有默认值的参数,必须出现在参数列表的最后。