第二十一章 Classes
Classes
类定义并不是 ObjectScript
的正式组成部分。相反,可以在类定义的特定部分中使用 ObjectScript
(特别是在方法定义中,可以在其中使用其他实现语言)。
类名和包
每个 IRIS
类都有一个名称,该名称在定义它的命名空间中必须是唯一的。完整的类名是由一个或多个句点分隔的字符串,如以下示例所示:package.subpackage.subpackage.class
。短类名是该字符串中最后一个句点之后的部分;最后一个句点之前的部分是包名称。
包名称只是一个字符串,但如果它包含句点,IRIS
开发工具会将每个句点分隔的部分视为子包。为了方便起见,集成开发环境 (IDE
) 和其他工具将这些子包显示为文件夹层次结构。
类定义的基本内容
IRIS
类定义可以包括以下项目,全部称为类成员:
-
Methods
方法——有两种方法:实例方法和类方法(在其他语言中称为静态方法)。在大多数情况下,方法是子例程subroutine
。 -
Parameters
参数 — 参数定义供此类使用的常量值。该值是在编译时设置的。 -
Properties
属性——属性包含类实例的数据。 -
Class queries
类查询 — 类查询定义可由该类使用的SQL
查询,并指定用作查询容器的类。 -
XData blocks
—XData
块是类中格式良好的XML
文档,供类使用。 - 仅与持久类相关的其他类型的类成员。
IRIS
类定义使用类定义语言 (CDL
) 来指定类及其成员。可以使用 Python
或 ObjectScript
在方法内部编写可执行代码。
类定义可以包含关键字;这些会影响类编译器的行为。可以为整个类指定一些关键字,为特定类成员指定其他关键字。这些关键字影响类编译器生成的代码,从而控制类的行为。
下面显示了一个简单的 IRIS
类定义,其中包含用 ObjectScript
和 Python
编写的方法:
Class MyApp.Main.SampleClass Extends %RegisteredObject
{
Parameter CONSTANTMESSAGE [Internal] = "Hello world!" ;
Property VariableMessage As %String [ InitialExpression = "How are you?"];
Property MessageCount As %Numeric [Required];
ClassMethod HelloWorld() As %String [ Language = objectscript ]
{
Set x=..#CONSTANTMESSAGE
Return x
}
Method WriteIt() [ Language = objectscript, ServerOnly = 1]
{
Set count=..MessageCount
For i=1:1:count {
Write !,..#CONSTANTMESSAGE," ",..VariableMessage
}
}
}
Class MyApp.Main.SampleClass Extends %RegisteredObject
{
Parameter CONSTANTMESSAGE [Internal] = "Hello world!" ;
Property VariableMessage As %String [ InitialExpression = "How are you?"];
Property MessageCount As %Numeric [Required];
ClassMethod MessageWrapper() As %String [ Language = objectscript ]
{
return ..#CONSTANTMESSAGE
}
ClassMethod HelloWorld() As %String [ Language = python ]
{
import iris
x = iris.cls("MyApp.Main.SampleClass").MessageWrapper()
return x
}
Method WriteIt() [ ServerOnly = 1, Language = python ]
{
import iris
CONSTANTMESSAGE = self.MessageWrapper()
count = self.MessageCount
print()
for i in range(count):
print(CONSTANTMESSAGE, self.VariableMessage)
}
}
请注意以下几点:
- 第一行给出了类的名称。
MyApp.Main.SampleClass
是完整类名,MyApp.Main
是包名,SampleClass
是短类名。
IDE
和其他用户界面将每个包视为一个文件夹。
-
Extends
是编译器关键字。
Extends
关键字指定该类是中 %RegisteredObject
的子类,该类是为对象支持提供的系统类。此示例类仅扩展一个类,但可以扩展多个其他类。这些类又可以扩展其他类。
-
CONSTANTMESSAGE
是一个参数。按照惯例,IRIS
系统类中的所有参数的名称全部大写。这是一个方便的约定,但不需要遵循它。
Internal
关键字是编译器关键字。它将这个参数标记为内部参数,从而禁止它在类文档中显示。该参数有一个字符串值。
必须通过 ObjectScript
访问类参数。在此类的 Python
版本中,我们使用 ObjectScript
类方法 MessageWrapper()
返回参数的值。
- 可以从
Python
访问任何类方法。可以在所有上下文中使用iris.cls("Package.Class").classMethodName()
语法,并在Python
实例方法中使用self.classMethodName()
语法。该示例显示了两种语法形式。 -
VariableMessage
和MessageCount
是属性。As
后面的项目指示这些属性的类型。InitialExpression
和Required
是编译器关键字。
可以直接从 ObjectScript
或 Python
访问 IRIS
类属性,如示例中所示。
-
HelloWorld()
是一个类方法,它返回一个字符串;这由As
后面的项目表示。
此方法使用类参数的值。
-
WriteIt()
是一个实例方法,它不返回值。
此方法使用类参数的值和两个属性的值。
ServerOnly
编译器关键字意味着该方法不会投射到外部客户端。
以下终端会话显示了我们如何使用此类。两个终端 shell
对于该类的 ObjectScript
和 Python
版本均有效。
TESTNAMESPACE>write ##class(MyApp.Main.SampleClass).HelloWorld()
Hello world!
TESTNAMESPACE>set x=##class(MyApp.Main.SampleClass).%New()
TESTNAMESPACE>set x.MessageCount=3
TESTNAMESPACE>do x.WriteIt()
Hello world! How are you?
Hello world! How are you?
Hello world! How are you?
>>> print(iris.cls("MyApp.Main.SampleClass").HelloWorld())
Hello world!
>>> x=iris.cls("MyApp.Main.SampleClass")._New()
>>> x.MessageCount=3
>>> x.WriteIt()
Hello world! How are you?
Hello world! How are you?
Hello world! How are you?
网友评论