在Delphi中,Record类型支持操作符重载,即class operator overloading.
其中":="操作符(即赋值)对应的是"implicit"。如果我们针对其编写重载操作符的代码,则可以实现类似Variant类型的万用数据类型。
举例说明
TStringData=Record
private
fData:String;
public
class operator implicit(src:string):TStringData;
class operator implicit(src:TStringData):String;
end;
//SD(TStringData类型):=S(String类型)
class operator TStringData.implicit(src:string):TStringData;
begin
result.fData:=src;
end;
//S(String类型):=SD(TStringData类型)
class operator TStringData.implicit(src:TStringData):string;
begin
result:=src.fData;
end;
这样,我们通过不断的重载implicit (:=)操作符,则可以实现,TStringData与不同类型数据之间的直接赋值操作。
例如:
//SD(TStringData类型):=I(integer类型)
class operator implicit(src: integer): TStringData;
//SD(TStringData类型):=I64(int64类型)
class operator implicit(src: int64): TStringData;
//SD(TStringData类型):=DT(TDateTime类型)
class operator implicit(src: TDateTime): TStringData;
//SD(TStringData类型):=D(Double类型)
class operator implicit(src: Double): TStringData;
//SD(TStringData类型):=B(Boolean类型)
class operator implicit(src: Boolean): TStringData;
//SD(TStringData类型):=G(TGuid类型)
class operator implicit(src: TGuid): TStringData;
//SD(TStringData类型):=E(Extended类型)
//x:=1.2 ,这时的1.2一般是Extended类型
class operator implicit(src: Extended): TStringData;
//SD(TStringData类型):=AB(TArray<Byte>类型)
class operator implicit(src: TArray<Byte>): TStringData;
//I(Integer类型):=SD(TStringData类型)
class operator implicit(src: TStringData): integer;
//I64(Int64类型):=SD(TStringData类型)
class operator implicit(src: TStringData): int64;
//DT(TDateTime类型):=SD(TStringData类型)
class operator implicit(src: TStringData): TDateTime;
//D(Double类型):=SD(TStringData类型)
class operator implicit(src: TStringData): Double;
//B(Boolean类型):=SD(TStringData类型)
class operator implicit(src: TStringData): Boolean;
//G(TGuid类型):=SD(TStringData类型)
class operator implicit(src: TStringData): TGuid;
//E(Extended类型):=SD(TStringData类型)
class operator implicit(src: TStringData): Extended;
//AB(TArray<Byte>类型):=SD(TStringData类型)
class operator implicit(src: TStringData): TArray<Byte>;
另外可以实现同类型之间的赋值。
class operator implicit(src: TStringData): TStringData;