2

我想声明一个自定义数据类型以获得更好的代码可读性。目的是保持这种类型不受其他 AnsiString 的干扰。但是Delphi好像不支持吧?

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 中声明这样的自定义类型?

4

2 回答 2

8

你不应该在你做的地方出错,但你的初始技术无论如何都不会实现你的目标。注意TFileName一个独特的字符串类型和你的一样,但它可以在任何需要普通字符串的地方使用。该type声明更多的是为一个类型建立不同的RTTI,以便在设计时可以用于不同类型的属性编辑器。

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

于 2013-07-12T13:20:47.717 回答
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;

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

于 2013-07-12T13:26:10.213 回答