第二十一章 Classes
Classes
類定義并不是 ObjectScript
的正式組成部分。相反,可以在類定義的特定部分中使用 ObjectScript
(特別是在方法定義中,可以在其中使用其他實現(xiàn)語言)。
類名和包
每個 IRIS
類都有一個名稱,該名稱在定義它的命名空間中必須是唯一的。完整的類名是由一個或多個句點分隔的字符串,如以下示例所示:package.subpackage.subpackage.class
。短類名是該字符串中最后一個句點之后的部分;最后一個句點之前的部分是包名稱。
包名稱只是一個字符串,但如果它包含句點,IRIS
開發(fā)工具會將每個句點分隔的部分視為子包。為了方便起見,集成開發(fā)環(huán)境 (IDE
) 和其他工具將這些子包顯示為文件夾層次結(jié)構(gòu)。
類定義的基本內(nèi)容
IRIS
類定義可以包括以下項目,全部稱為類成員:
-
Methods
方法——有兩種方法:實例方法和類方法(在其他語言中稱為靜態(tài)方法)。在大多數(shù)情況下,方法是子例程subroutine
。 -
Parameters
參數(shù) — 參數(shù)定義供此類使用的常量值。該值是在編譯時設(shè)置的。 -
Properties
屬性——屬性包含類實例的數(shù)據(jù)。 -
Class queries
類查詢 — 類查詢定義可由該類使用的SQL
查詢,并指定用作查詢?nèi)萜鞯念悺?/li> -
XData blocks
—XData
塊是類中格式良好的XML
文檔,供類使用。 - 僅與持久類相關(guān)的其他類型的類成員。
IRIS
類定義使用類定義語言 (CDL
) 來指定類及其成員??梢允褂?Python
或 ObjectScript
在方法內(nèi)部編寫可執(zhí)行代碼。
類定義可以包含關(guān)鍵字;這些會影響類編譯器的行為。可以為整個類指定一些關(guān)鍵字,為特定類成員指定其他關(guān)鍵字。這些關(guān)鍵字影響類編譯器生成的代碼,從而控制類的行為。
下面顯示了一個簡單的 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
是編譯器關(guān)鍵字。
Extends
關(guān)鍵字指定該類是中 %RegisteredObject
的子類,該類是為對象支持提供的系統(tǒng)類。此示例類僅擴(kuò)展一個類,但可以擴(kuò)展多個其他類。這些類又可以擴(kuò)展其他類。
-
CONSTANTMESSAGE
是一個參數(shù)。按照慣例,IRIS
系統(tǒng)類中的所有參數(shù)的名稱全部大寫。這是一個方便的約定,但不需要遵循它。
Internal
關(guān)鍵字是編譯器關(guān)鍵字。它將這個參數(shù)標(biāo)記為內(nèi)部參數(shù),從而禁止它在類文檔中顯示。該參數(shù)有一個字符串值。
必須通過 ObjectScript
訪問類參數(shù)。在此類的 Python
版本中,我們使用 ObjectScript
類方法 MessageWrapper()
返回參數(shù)的值。
- 可以從
Python
訪問任何類方法??梢栽谒猩舷挛闹惺褂?iris.cls("Package.Class").classMethodName()
語法,并在Python
實例方法中使用self.classMethodName()
語法。該示例顯示了兩種語法形式。 -
VariableMessage
和MessageCount
是屬性。As
后面的項目指示這些屬性的類型。InitialExpression
和Required
是編譯器關(guān)鍵字。
可以直接從 ObjectScript
或 Python
訪問 IRIS
類屬性,如示例中所示。
-
HelloWorld()
是一個類方法,它返回一個字符串;這由As
后面的項目表示。
此方法使用類參數(shù)的值。
-
WriteIt()
是一個實例方法,它不返回值。
此方法使用類參數(shù)的值和兩個屬性的值。
ServerOnly
編譯器關(guān)鍵字意味著該方法不會投射到外部客戶端。文章來源:http://www.zghlxwxcb.cn/news/detail-702914.html
以下終端會話顯示了我們?nèi)绾问褂么祟?。兩個終端 shell
對于該類的 ObjectScript
和 Python
版本均有效。文章來源地址http://www.zghlxwxcb.cn/news/detail-702914.html
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?
到了這里,關(guān)于第二十一章 Classes的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!