delphi类运算符is和as的使用实例|方法
在程序运行期间,可以使用Is 运算符和As 运算符来进行类信息检测和类型转换,通常也把这两个运算符称为运行时类型信息(RTTI:Runtime Type Information)运算符。
1.Is 运算符
Is 运算符用来检测一个对象在运行时的类的类型,具体形式如下:
object is class
如果返回值为True,那么对象Object 是类Class 或者是类Class 派生类的一个实例。如果对象为nil,返回值则为False。
2.As 运算符
As 运算符用来进行类型转换检测的,具体形式如下:
object as class 返回值为Object 的一个为Class 类型的引用。在运行期间,Object 必须是与Class 类兼容的一个类的对象或nil。通常为了避免类型不兼容,可以使用Is 运算符来进行类型判断。
下面的例子对Is 运算符和As 运算符进行了说明:
program Project1;
{$APPTYPE CONSOLE}
type
TPerson = class //人类
public
Name:string; //姓名
end;
TEmployee = class(TPerson) //顾客类
public
DeptName:string; //地址名称
procedure Infor; //只有子类具有"显示信息"的方法
end;
TCustomer = class(TPerson) //顾客类
public
DeptName:String;
procedure Infor;
end;
procedure TEmployee.Infor;
begin
Writeln(’姓名:’,Name,’; 部门名称:’,DeptName);
end;
procedure TCustomer.Infor;
begin
Writeln(’姓名:’,Name,’; 部门名称:’,DeptName);
end;
var
P1: TPerson; //声明一个人类的变量
E1: TEmployee; //声明一个顾客类的变量
begin
P1:=TPerson.Create; //P1 为父类的对象
P1.Name:=’张三’;
if P1 is TCustomer then (P1 as TCustomer).DeptName:=’人事部’ ;
if P1 is TCustomer then (P1 as TCustomer).Infor;
P1.Free;
P1:=TCustomer.Create; //P1 为子类的对象
P1.Name:=’冯六’;
if P1 is TCustomer then (P1 as TCustomer).DeptName:=’人事部’ ;
if P1 is TCustomer then (P1 as TCustomer).Infor;
P1.Free;
E1:=TEmployee.Create; //E1 为子类的对象
E1.Name:=’高七’;
if E1 is TEmployee then (E1 as TEmployee).DeptName:=’公关部’;
if E1 is TEmployee then (E1 as TEmployee).Infor;
E1.Free;
Readln;
end. 运行结果如下:
姓名:冯六; 部门名称:人事部
姓名:高七; 部门名称:公关部 这里有几点需要说明:
• 当P1 调用TPerson 类的构造函数的时候,创建的是一个TPerson 的对象,不可以调用子类TCustomer 中特有的过程Infor,也不可以对子类中的特有属性DeptName 进行操作。在调用时要用Is运算符来判断P1 是否为TCustomer 类的对象。
• TPerson 类的变量P1 被“创建”了两次,由于前后两次创建的类型不同,所以Is 运算符判断的结果不同。第2 次“P1 is TCustomer”返回的是True,然后进行类型转换并访问DeptName 属性和调用Infor 过程。