第二十五章 Classes - 基于数据类型的属性
基于数据类型的属性
当定义属性并将其类型指定为数据类型类时,可以使用特殊选项来定义和使用该属性,如本节中所述。
数据类型类
数据类型类使能够强制执行有关属性值的规则集。
IRIS
提供的数据类型类包括 %Library.String
、 %Library.Integer
、 %Library.Numeric
、%Library.Date
等等。因为 %Library
包的类名可以缩写,所以可以缩写其中的许多类;例如, %Date
是 %Library.Date
的缩写。
每个数据类型类都具有以下特征:
-
它指定编译器关键字的值。对于属性,编译器关键字可以执行以下操作:
- 使属性成为必需的
- 指定属性的初始值
- 控制如何将属性映射到
SQL
、ODBC
和Java
客户端
-
它指定影响细节的参数值,如下所示:
- 数据类型允许的最大和最小逻辑值
- 字符串可以包含的最大和最小字符数
- 小数点后的位数
- 如果字符串超过最大字符数是否截断
- 显示格式
- 如何转义任何特殊的
XML
或HTML
字符 - 可在任何用户界面中使用的逻辑值和显示值的枚举列表
- 字符串必须匹配的模式(自动使用模式匹配运算符)
- 导入或导出到
XML
时是否尊重或忽略UTC
时区
-
它提供了一组方法来在存储(磁盘上)、逻辑(内存中)和显示格式之间转换文字数据。
可以添加自己的数据类型类。例如,以下显示了 %Library.String
的自定义子类:
Class MyApp.MyType Extends %Library.String
{
/// The maximum number of characters the string can contain.
Parameter MAXLEN As INTEGER = 2000;
}
覆盖数据类型类的参数
当定义属性并将其类型指定为数据类型类时,可以覆盖该数据类型类定义的任何参数。
例如,数据类型类中的 %Integer
定义了类参数 (MAXVAL
),但没有为此参数提供任何值。可以在属性定义中覆盖它,如下所示:
Property MyInteger As %Integer(MAXVAL=10);
对于此属性,最大允许值为 10
。
(在内部,这是有效的,因为数据类型类的验证方法是方法生成器;当编译器为类生成代码时,将使用提供的参数值。
同样,每个 %String
类型的属性都有一个排序规则类型,它确定值的排序方式(例如大小写是否有效)。默认排序规则类型是 SQLUPPER
。
再例如,数据类型类定义 DISPLAYLIST
和 VALUELIST
参数,可以使用它们来指定要在用户界面中显示的选项及其相应的内部值:
Property Gender As %String(DISPLAYLIST = ",Female,Male", VALUELIST = ",F,M");
使用其他属性方法
属性有许多自动关联的方法。这些方法由数据类型类生成,可以从 ObjectScript
访问。
例如,如果定义一个具有三个属性的类 Person
:
Class MyApp.Person Extends %Persistent
{
Property Name As %String;
Property Age As %Integer;
Property DOB As %Date;
}
每个生成的方法的名称都是属性名称与继承类中的方法名称相连接。可以从 ObjectScript
访问这些生成的方法,如下例所示。可以通过直接从继承的类调用关联的方法来从 Python
访问相同的信息。例如,类中的 %Date
以及 DOB
属性关联的一些方法是:
Set x = person.DOBIsValid(person.DOB)
Write person.DOBLogicalToDisplay(person.DOB)
x = iris.cls("%Date").IsValid(person.DOB)
print(iris.cls("%Date").LogicalToDisplay(person.DOB))
其中 IsValid
是属性类的方法,LogicalToDisplay
是数据类型类中 %Date
的方法。