类参数定义了一个给定类的所有对象都可用的特殊常量值。在创建类定义时(或编译之前的任何时候),可以设置类参数的值。默认情况下,每个参数的值都是空字符串,但是可以指定一个非空值作为参数定义的一部分。在编译时,为类的所有实例建立参数值。除了少数例外情况,此值不能在运行时更改。
类参数通常用于以下目的:
要在类定义中添加类参数,请在类中添加如下元素之一:
Parameter PARAMNAME;
Parameter PARAMNAME as Type;
Parameter PARAMNAME as Type = value;
Parameter PARAMNAME as Type [ Keywords ] = value;
没有必要指定参数类型,但如果指定了,则该信息主要用于开发环境。Studio中的类检查器使用参数类型来提供适当的选项和验证。例如,如果参数类型为布尔型,则类检查器提供选项0和1。
参数类型包括布尔型、字符串型和整数型。注意,这些不是Caché类名。有关完整列表[BOOLEAN ,CLASSNAME,COSCODE ,COSEXPRESSION ,COSIDENTIFIER ,INTEGER ,SQL,SQLIDENTIFIER ,STRING ,TEXT ,CONFIGVALUE ]
除了COSEXPRESSION和CONFIGVALUE类型(都在小节中描述过)之外,编译器会忽略参数类型。
可以将参数定义为在运行时对其求值的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。在本例中,可以通过$SYSTEM.OBJ.UpdateConfigParam()方法修改参数。例如,以下更改参数MYPARM(在类MyApp.MyClass中)的值,使其新值为42:
set sc=$system.OBJ.UpdateConfigParam("MyApp.MyClass","MYPARM",42)
注意, S Y S T E M . O B J . U p d a t e C o n f i g P a r a m ( ) 会 影 响 任 何 新 进 程 使 用 的 生 成 的 类 描 述 符 , 但 不 会 影 响 类 定 义 。 如 果 重 新 编 译 该 类 , 那 么 C a c h e ˊ 将 重 新 生 成 类 描 述 符 , 它 现 在 将 使 用 类 定 义 中 包 含 的 这 个 参 数 的 值 , 从 而 覆 盖 通 过 SYSTEM.OBJ.UpdateConfigParam()会影响任何新进程使用的生成的类描述符,但不会影响类定义。 如果重新编译该类,那么Caché将重新生成类描述符,它现在将使用类定义中包含的这个参数的值,从而覆盖通过 SYSTEM.OBJ.UpdateConfigParam()会影响任何新进程使用的生成的类描述符,但不会影响类定义。如果重新编译该类,那么Cacheˊ将重新生成类描述符,它现在将使用类定义中包含的这个参数的值,从而覆盖通过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(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;
}