2013-07-12 47 views
2

我想声明一个自定义数据类型以获得更好的代码可读性。其目的是保持这种类型不受其他AnsiStrings的干扰。但德尔福似乎不支持它?如何在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中声明这样的自定义类型?

+0

** ** AnsiString?我不认为这是一个有效的声明开始。 –

+1

@RobKennedy我以前从来没有见过'AnsiString'的类型,但是因为它编译忽略了比较,只是为了兴趣它会是什么?调试器并没有真正帮助分析... – bummi

回答

8

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

要真正创建一个独特的类型,请尝试声明一个带有字段的记录来保存您的数据。记录与其他任何东西都不兼容,即使它们与另一种类型具有相同的结构。为了使您的记录与同类型的其他值相媲美,请在记录声明中提供EqualNotEqual方法以使比较操作员过载。要允许通过类型转换创建不同类型,但不能通过普通转让创建,请提供Explicit运算符,但不要运行Implicit

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; 

显然你要添加更多的功能,但这个纪录在遇到问题的规定的要求。

+0

优秀的建议,可惜我不能将两者都标记为答案.. – Kromster