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