如何在Delphi中声明自定义类型?

时间:2013-07-12 13:08:18

标签: delphi types

我想声明一个自定义数据类型以获得更好的代码可读性。目的是保持此类型不受任何干扰其他AnsiStrings。但德尔福似乎不支持它?

type
  TKMLocaleCode = type AnsiString;

... snip ...

procedure A;
var 
  A,B: TKMLocaleCode;
  C: AnsiString; 
begin
  A := 'eng'; //<<-- I expect an error here
  A := C; //<<-- I expect an error here too

  B := TKMLocaleCode('eng'); //<<-- I expect no error here
end;

是否可以在Delphi中声明这样的自定义类型?

2 个答案:

答案 0 :(得分:8)

你不应该在你所做的地方遇到错误,但你最初的技术无论如何都无法实现你的目标。请注意TFileName是一个与您的字符串类型不同的字符串类型,但它可以在预期普通字符串的任何地方使用。 type声明更适用于为类型建立不同的RTTI,以便它可以在设计时用于不同类型的属性编辑器。

要真正制作不同类型,请尝试使用字段声明记录以保存数据。记录与其他任何内容都不兼容,即使它们具有与其他类型相同的结构。要使您的记录与相同类型的其他值相当,请通过在记录声明中提供EqualNotEqual方法来重载比较运算符。要允许通过类型转换创建不同类型,而不是通过普通赋值,请提供Explicit运算符,但不能Implicit

答案 1 :(得分:4)

您可以声明一条记录,然后使用运算符重载来提供您希望支持的运算符:

type
  TKMLocaleCode = record
  strict private
    FValue: AnsiString;
  public
    class operator Explicit(const Value: string): TKMLocaleCode;
  end;

class operator TKMLocaleCode.Explicit(const Value: AnsiString): TKMLocaleCode;
begin
  Result.FValue := Value;
end;

显然,您需要添加更多功能,但此记录符合问题中所述的要求。