第三十二章 Objects
Objects
对象类简介
IRIS
通过以下对象类提供对象技术: %Library.RegisteredObject
、 %Library.Persistent
%Library.SerialObject
。
下图展示了这些类之间的继承关系,以及它们的一些参数和方法。 %Library
包的类名称可以缩写,因此(例如) %Persistent
是 %Library.Persistent
的缩写。这里,全部大写的项目是参数,以百分号开头的项目是方法。
在典型的基于类的应用程序中,可以根据这些类(以及专门的系统子类)定义类。所有对象都直接或间接继承自这些类之一,并且每个对象都是以下类型之一:
-
注册对象是
%RegisteredObject
或其子类的实例。可以创建这些对象,但无法保存它们。另外两个类继承自%RegisteredObject
,因此包含该类的所有参数、方法等。 -
持久对象是
%Persistent
的实例或子类。可以创建、保存、打开和删除这些对象。
持久类会自动映射到可以通过 SQL
访问的表。
- 串行对象是
%SerialObject
或其子类的实例。串行类旨在用作另一个对象的属性。可以创建这些对象,但不能独立于包含它们的对象来保存或打开它们。
注意:通过类 %DynamicObject
和 %DynamicArray
, IRIS
还提供了处理没有模式的对象和数组的能力。
对象类的基本特征
通过对象类,可以执行以下任务:
- 可以创建一个对象(类的实例)。为此,可以使用该类的
%New()
方法,该方法继承自%RegisteredObject
。
set myobj=##class(Sample.Person).%New()
myobj = iris.cls("Sample.Person")._New()
Python
方法名称不能包含百分号 (%
)。可以通过将 Python
中的 %
字符替换为下划线 (_
) 来调用任何包含 %
字符的 ObjectScript
方法,如示例中所示。
- 可以使用属性。
可以在任何类中定义属性,但它们仅在对象类中有用,因为只有这些类允许创建实例。
任何属性都包含单个文字值、对象(可能是集合对象)或多维数组(罕见)。以下示例显示了对象值属性的定义:
Property Home As Sample.Address;
Sample.Address
是另一个类。下面显示了设置 Home
属性值的一种方法:
Set myaddress=##class(Sample.Address).%New()
Set myaddress.City="Louisville"
Set myaddress.Street="15 Winding Way"
Set myaddress.State="Georgia"
Set myperson=##class(Sample.Person).%New()
Set myperson.Home=myaddress
import iris
myaddress=iris.cls("Sample.Address")._New()
myaddress.City="Louisville"
myaddress.Street="15 Winding Way"
myaddress.State="Georgia"
myperson=iris.cls("Sample.Person")._New()
myperson.Home=myaddress
- 如果类或其超类定义了实例方法,则可以调用该类实例的方法。例如:
Method PrintPerson() [ Language = objectscript ]
{
Write !, "Name: ", ..Name
}
Method PrintPerson() [ Language = objectscript ]
{
Write !, "Name: ", ..Name
}
如果 myobj
是定义此方法的类的实例,则可以按如下方式调用此方法:
Do myobj.PrintPerson()
myobj.PrintPerson()
- 可以验证属性值是否符合属性定义中给出的规则
- 所有对象都继承实例方法
%NormalizeObject()
,该方法规范化所有对象的属性值。许多数据类型允许相同值的不同表示。标准化将值转换为其规范或标准化形式。%NormalizeObject()
根据此操作是否成功返回true
或false
。 - 所有对象都继承实例方法
%ValidateObject()
,该方法根据属性值是否符合属性定义返回true
或false
。 - 所有持久对象都继承实例方法
%Save()
。当使用%Save()
实例方法时,系统会首先自动调用%ValidateObject()
。
- 所有对象都继承实例方法
相反,当在例程级别工作并且不使用类时,代码必须包含用于检查类型和其他输入要求的逻辑。
- 可以定义回调方法,以在创建、修改对象等时添加其他自定义行为。
例如,要创建类的实例,可以调用该类的 %New()
方法。如果该类定义了 %OnNew()
方法(回调方法),则 IRIS
也会自动调用该方法。下面展示了一个简单的例子:
Method %OnNew() As %Status
{
Write "hi there"
Return $$$OK
}
Method %OnNew() As %Status [ Language = python ]
{
print("hi there")
return True
}
在实际场景中,此回调可能会执行一些所需的初始化。它还可以通过写入文件或global
文件来执行日志记录。
网友评论