第四章 类参数介绍
类参数定义了一个给定类的所有对象都可用的特殊常量值。在创建类定义时(或编译之前的任何时候),可以设置类参数的值。默认情况下,每个参数的值都是空字符串,但是可以指定一个非空值作为参数定义的一部分。在编译时,为类的所有实例建立参数值。除了少数例外情况,此值不能在运行时更改。
类参数通常用于以下目的:
- 自定义各种数据类型类的行为(例如提供验证信息)。
- 定义有关类定义的特定于用户的信息。类参数只是一个任意的名称-值对;可以使用它来存储关于类的任何信息。
- 定义一个类特定的常数值。
- 提供要使用的方法生成器方法的参数化值。方法生成器是一种特殊类型的方法,它的实现实际上是一个在编译时运行的短程序,以便为该方法生成实际的运行时代码。许多方法生成器使用类参数。
定义类的参数
要在类定义中添加类参数,请在类中添加如下元素之一:
Parameter PARAMNAME;
Parameter PARAMNAME as Type;
Parameter PARAMNAME as Type = value;
Parameter PARAMNAME as Type [ Keywords ] = value;
- PARAMNAME 是参数名称 注意,按照惯例,Caché系统类中的参数几乎都是大写的,这种约定提供了一种简单的方法来区分参数和其他类成员。
- Type 是参数类型。
- value 是参数值,在大多数情况下,这是一个文本值,如100或“MyValue”。对于某些类型,这可以是Caché ObjectScript表达式。
- Keywords 代表参数关键字。可选的[Abstract,Constraint,Final,Flags,Internal]
参数类型和值
没有必要指定参数类型,但如果指定了,则该信息主要用于开发环境。Studio中的类检查器使用参数类型来提供适当的选项和验证。例如,如果参数类型为布尔型,则类检查器提供选项0和1。
参数类型包括布尔型、字符串型和整数型。注意,这些不是Caché类名。有关完整列表[BOOLEAN ,CLASSNAME,COSCODE ,COSEXPRESSION ,COSIDENTIFIER ,INTEGER ,SQL,SQLIDENTIFIER ,STRING ,TEXT ,CONFIGVALUE ]
除了COSEXPRESSION和CONFIGVALUE类型(都在小节中描述过)之外,编译器会忽略参数类型。
要在运行时计算的类参数(COSEXPRESSION)
可以将参数定义为在运行时对其求值的ObjectScript表达式。为此,将其类型指定为COSEXPRESSION,并将ObjectScript表达式指定为值:
Parameter PARAMNAME As COSEXPRESSION = "ObjectScriptExpression";
其中PARAMNAME是正在定义的参数,ObjectScriptExpression是在运行时计算的ObjectScript内容。一个类参数定义的例子是:
Parameter DateParam As COSEXPRESSION = "$H";
要在编译时计算的类参数(花括号)
可以将参数定义为在编译时计算的ObjectScript表达式。要做到这一点,指定没有类型和指定的值在花括号:
Parameter PARAMNAME = {ObjectScriptExpression};
其中PARAMNAME是正在定义的参数,ObjectScriptExpression是在运行时计算的ObjectScript内容。
Parameter COMPILETIME = {$zdatetime($h)};
类参数在运行时更新(CONFIGVALUE)
可以定义一个参数,以便它可以在类定义之外进行修改。为此,将其类型指定为CONFIGVALUE。在本例中,可以通过$SYSTEM.OBJ.UpdateConfigParam()方法修改参数。例如,以下更改参数MYPARM(在类MyApp.MyClass中)的值,使其新值为42:
set sc=$system.OBJ.UpdateConfigParam("MyApp.MyClass","MYPARM",42)
注意,SYSTEM.OBJ.UpdateConfigParam()所做的更改。
引用类的参数
要引用类的参数,可以执行以下任何操作:
- 在内部类的方法中,使用以下表达式:
..#PARMNAME
可以将此表达式与DO和SET命令一起使用,也可以将其用作另一个表达式的一部分.
set object.PropName=..#PARMNAME
在下一个变量中,类中的一个方法检查一个参数的值,并使用它来控制后续处理:
if ..#PARMNAME=1 {
//do something
} else {
//do something else
}
- 要访问任何类中的参数,请使用以下表达式:
##class(Package.Class).#PARMNAME
其中Package.Class是类的名称,PARMNAME是参数的名称。
该语法访问给定的类参数并返回其值:
可以将此表达式与DO和SET等命令一起使用,也可以将其用作另一个表达式的一部分。以下是一个例子:
w ##class(%XML.Adaptor).#XMLIGNOREINVALIDTAG
- 要访问参数,其中参数名直到运行时才确定,使用$ parameter函数:
$PARAMETER(classnameOrOref,parameter)
其中classnameOrOref要么是类的完全限定名,要么是类实例的OREF,而parameter的计算结果是关联类中的一个参数的名称。
Parameter DateParam As COSEXPRESSION = "$zd(+$H,3)";
Parameter COMPILETIME = {$zdatetime($h,3)};
Parameter MYPARM As CONFIGVALUE;
Parameter STR = 1;
/// w ##class(PHA.IP.MOB.Business).test("自煎","饭后温服") "N"
/// w ##class(PHA.IP.MOB.Business).test("代煎","饭后温服") "Y"
/// w ##class(PHA.IP.MOB.Business).test("代煎","加工膏滋") "N"
/// w ##class(PHA.IP.MOB.Business).test("自煎","加工膏滋") "N"
ClassMethod test(a, b)
{
;d ..importPackage()
s date=..#DateParam
w "date: "_date,!
//date: 2020-02-05
s time=..#COMPILETIME
w "time "_time,!
//time 2020-02-05 16:33:02
s sc=$system.OBJ.UpdateConfigParam("PHA.IP.MOB.Business","MYPARM","aaaa")
w "sc "_sc,!
//sc 1
s MYPARM=..#MYPARM
w "MYPARM "_MYPARM,!
//MYPARM aaaa
s STR=$system.OBJ.UpdateConfigParam("PHA.IP.MOB.Business","STR",2)
w "STR "_STR,!
s STRFLAG=##class(Android).#STRFLAG
w "STRFLAG "_STRFLAG,!
//STRFLAG 1
b ;1
}
Class PHA.OP.MOB.Android Extends %RegisteredObject [ ClassType = "", Not ProcedureBlock ]
{
Parameter STRFLAG As BOOLEAN = 1;
}