我想声明一个自定义数据类型,以获得更好的代码可读性.目的是保持此类型不受任何干扰其他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;
Run Code Online (Sandbox Code Playgroud)
是否可以在Delphi中声明这样的自定义类型?
你不应该在你所做的地方遇到错误,但你最初的技术无论如何都无法实现你的目标.请注意TFileName,与您的字符串类型的字符串类型如何,但它可以在预期的普通字符串的任何位置使用.该type声明更多的是为类型建立不同的RTTI,以便它可以在设计时用于不同类型的属性编辑器.
要真正创建不同类型,请尝试使用字段声明记录以保存数据.记录与其他任何内容都不兼容,即使它们具有与其他类型相同的结构.要使您的记录与相同类型的其他值相当,请通过在记录声明中提供Equal和NotEqual方法来重载比较运算符.要允许通过类型转换创建不同类型,而不是通过普通赋值,请提供Explicit运算符,但不能Implicit.
您可以声明一条记录,然后使用运算符重载来提供您希望支持的任何运算符:
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;
Run Code Online (Sandbox Code Playgroud)
显然,您需要添加更多功能,但此记录满足问题中所述的要求。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           994 次  |  
        
|   最近记录:  |