delphi类的多态性
多态性
在Object Pascal 语言中定义的类的方法通常是“静态”的,也就是在编译和链接阶段就确定了对象方法的调用地址。
面向对象的程序设计语言还可以在运行时才确定对象方法的调用地址,这种调用函数的方式叫做多态性,有时也称为动态联编或滞后联编。在Object Pascal 语言中,多态性是通过虚拟方法或动态方法实现的。
通常,可以将类中的方法定义为下面的3 种方式:
• 静态方法。
• 虚拟方法。
• 动态方法。
在默认情况下定义的方法为静态方法,静态方法的调用地址在编译和链接的过程中就确定了。
在类中,如果定义了一个方法,在它的派生类中也可以定义一个同样的方法。对于静态方法,通常叫做“静态重载”。
下面的例子说明了静态方法Infor 的调用情况:
program Project1;
{$APPTYPE CONSOLE}
type
TPerson = class //人类
procedure Infor; //显示信息
end;
TEmployee = class(TPerson) //职员类
procedure Infor; //显示职员信息
end;
procedure TPerson.Infor; //显示调用的是TPerson 类的Infor
begin
Writeln ( ’TPerson.Infor’);
end;
procedure TEmployee.Infor; //显示调用的是TEmployee 类的Infor
begin
Writeln(’TEmployee.Infor’);
end;
var
P1: TPerson; //声明一个人类的变量
E1: TEmployee; //声明一个职员类的变量
begin
P1:=TPerson.Create ;
P1.Infor; //调用的是TPerson 类的Infor
P1.Destroy;
P1:=TEmployee.Create;
P1.Infor; //调用的是TPerson 类的Infor
TEmployee(P1).Infor; //调用的是TEmployee 的Infor
P1.Destroy;
E1:=TEmployee.Create;
E1.Infor; //调用的是TEmployee 类的Infor
E1.Destroy;
end. 运行结果如下:
TPerson.Infor
TPerson.Infor
TEmployee.Infor
TEmployee.Infor 可以看到,在“静态重载”的情况下,Infor 的调用是根据对象的类型来确定的。虚拟方法和动态方法也可以在派生类中被重载,通常称为“动态重载”。对象方法具体使用的并不是变量声明时指定的类的类型。