【问题标题】:How to declare custom types in Delphi?如何在 Delphi 中声明自定义类型?
【发布时间】:2013-07-12 13:08:17
【问题描述】:

我想声明一个自定义数据类型以获得更好的代码可读性。目的是保持这种类型免受与其他 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 中声明这样的自定义类型?

【问题讨论】:

  • 类型 AnsiString?我认为这不是一个有效的声明。
  • @RobKennedy 我以前从未见过Type of AnsiString,但由于它编译时省略了比较,只是为了感兴趣,它会是什么?调试器并不能真正帮助分析...

标签: delphi types


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多