第四章 Caché 类参数介绍

第四章 类参数介绍

类参数定义了一个给定类的所有对象都可用的特殊常量值。在创建类定义时(或编译之前的任何时候),可以设置类参数的值。默认情况下,每个参数的值都是空字符串,但是可以指定一个非空值作为参数定义的一部分。在编译时,为类的所有实例建立参数值。除了少数例外情况,此值不能在运行时更改。

类参数通常用于以下目的:

  • 自定义各种数据类型类的行为(例如提供验证信息)。
  • 定义有关类定义的特定于用户的信息。类参数只是一个任意的名称-值对;可以使用它来存储关于类的任何信息。
  • 定义一个类特定的常数值。
  • 提供要使用的方法生成器方法的参数化值。方法生成器是一种特殊类型的方法,它的实现实际上是一个在编译时运行的短程序,以便为该方法生成实际的运行时代码。许多方法生成器使用类参数。

定义类的参数

要在类定义中添加类参数,请在类中添加如下元素之一:

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)

注意, 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()所做的更改。

引用类的参数

要引用类的参数,可以执行以下任何操作:

  • 在内部类的方法中,使用以下表达式:
..#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;
}
发布了13 篇原创文章 · 获赞 1 · 访问量 362

猜你喜欢

转载自blog.csdn.net/yaoxin521123/article/details/104892610