Objects
對象類簡介
IRIS 通過以下對象類提供對象技術(shù): %Library.RegisteredObject、 %Library.Persistent``%Library.SerialObject。
下圖展示了這些類之間的繼承關(guān)系,以及它們的一些參數(shù)和方法。 %Library 包的類名稱可以縮寫,因此(例如) %Persistent 是 %Library.Persistent 的縮寫。這里,全部大寫的項目是參數(shù),以百分號開頭的項目是方法。

在典型的基于類的應(yīng)用程序中,可以根據(jù)這些類(以及專門的系統(tǒng)子類)定義類。所有對象都直接或間接繼承自這些類之一,并且每個對象都是以下類型之一:
- 注冊對象是
%RegisteredObject或其子類的實例??梢詣?chuàng)建這些對象,但無法保存它們。另外兩個類繼承自%RegisteredObject,因此包含該類的所有參數(shù)、方法等。 - 持久對象是
%Persistent的實例或子類??梢詣?chuàng)建、保存、打開和刪除這些對象。
持久類會自動映射到可以通過 SQL 訪問的表。
- 串行對象是
%SerialObject或其子類的實例。串行類旨在用作另一個對象的屬性。可以創(chuàng)建這些對象,但不能獨立于包含它們的對象來保存或打開它們。
注意:通過類 %DynamicObject 和 %DynamicArray, IRIS 還提供了處理沒有模式的對象和數(shù)組的能力。
對象類的基本特征
通過對象類,可以執(zhí)行以下任務(wù):
- 可以創(chuàng)建一個對象(類的實例)。為此,可以使用該類的
%New()方法,該方法繼承自%RegisteredObject。
set myobj=##class(Sample.Person).%New()
myobj = iris.cls("Sample.Person")._New()
Python 方法名稱不能包含百分號 (%)??梢酝ㄟ^將 Python 中的 % 字符替換為下劃線 (_) 來調(diào)用任何包含 % 字符的 ObjectScript 方法,如示例中所示。
- 可以使用屬性。
可以在任何類中定義屬性,但它們僅在對象類中有用,因為只有這些類允許創(chuàng)建實例。
任何屬性都包含單個文字值、對象(可能是集合對象)或多維數(shù)組(罕見)。以下示例顯示了對象值屬性的定義:
Property Home As Sample.Address;
Sample.Address 是另一個類。下面顯示了設(shè)置 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
- 如果類或其超類定義了實例方法,則可以調(diào)用該類實例的方法。例如:
Method PrintPerson() [ Language = objectscript ]
{
Write !, "Name: ", ..Name
}
Method PrintPerson() [ Language = objectscript ]
{
Write !, "Name: ", ..Name
}
如果 myobj 是定義此方法的類的實例,則可以按如下方式調(diào)用此方法:
Do myobj.PrintPerson()
myobj.PrintPerson()
- 可以驗證屬性值是否符合屬性定義中給出的規(guī)則
- 所有對象都繼承實例方法
%NormalizeObject(),該方法規(guī)范化所有對象的屬性值。許多數(shù)據(jù)類型允許相同值的不同表示。標(biāo)準(zhǔn)化將值轉(zhuǎn)換為其規(guī)范或標(biāo)準(zhǔn)化形式。%NormalizeObject()根據(jù)此操作是否成功返回true或false。 - 所有對象都繼承實例方法
%ValidateObject(),該方法根據(jù)屬性值是否符合屬性定義返回true或false。 - 所有持久對象都繼承實例方法
%Save()。當(dāng)使用%Save()實例方法時,系統(tǒng)會首先自動調(diào)用%ValidateObject()。
- 所有對象都繼承實例方法
相反,當(dāng)在例程級別工作并且不使用類時,代碼必須包含用于檢查類型和其他輸入要求的邏輯。
- 可以定義回調(diào)方法,以在創(chuàng)建、修改對象等時添加其他自定義行為。
例如,要創(chuàng)建類的實例,可以調(diào)用該類的 %New() 方法。如果該類定義了 %OnNew() 方法(回調(diào)方法),則 IRIS 也會自動調(diào)用該方法。下面展示了一個簡單的例子:
Method %OnNew() As %Status
{
Write "hi there"
Return $$$OK
}
Method %OnNew() As %Status [ Language = python ]
{
print("hi there")
return True
}
在實際場景中,此回調(diào)可能會執(zhí)行一些所需的初始化。它還可以通過寫入文件或global文件來執(zhí)行日志記錄。
-
參數(shù)
+關(guān)注
關(guān)注
11文章
1869瀏覽量
33936 -
SQL
+關(guān)注
關(guān)注
1文章
789瀏覽量
46680 -
應(yīng)用程序
+關(guān)注
關(guān)注
38文章
3344瀏覽量
60243
發(fā)布評論請先 登錄
求教關(guān)于“類和對象”方面編程的問題
關(guān)于LabVIEW 類及其對象使用的疑問
如何使用“SR300”找到多個對象?
沒有Xdm對象為Spartan 6與ISE 12.2的組錯誤
重置所有用戶對象和用戶功能的TitleBackColor
LabVIEW面向對象的ActorFramework(1)
談?wù)劽嫦?b class='flag-5'>對象編程
Java類與對象程序設(shè)計基礎(chǔ)
如何利用Python Remote objects技術(shù)實現(xiàn)分布式對象應(yīng)用系統(tǒng)
Chisel(三) Scala語法 類與對象
什么是不可變對象 不可變對象存儲可以抵御哪些威脅
類和對象是什么?
Objects:為對象類提供對象技術(shù)
評論