• 第二十一章 Classes


    第二十一章 Classes

    Classes

    类定义并不是 ObjectScript 的正式组成部分。相反,可以在类定义的特定部分中使用 ObjectScript(特别是在方法定义中,可以在其中使用其他实现语言)。

    类名和包

    每个 IRIS 类都有一个名称,该名称在定义它的命名空间中必须是唯一的。完整的类名是由一个或多个句点分隔的字符串,如以下示例所示:package.subpackage.subpackage.class。短类名是该字符串中最后一个句点之后的部分;最后一个句点之前的部分是包名称。

    包名称只是一个字符串,但如果它包含句点,IRIS 开发工具会将每个句点分隔的部分视为子包。为了方便起见,集成开发环境 (IDE) 和其他工具将这些子包显示为文件夹层次结构。

    类定义的基本内容

    IRIS 类定义可以包括以下项目,全部称为类成员:

    • Methods方法——有两种方法:实例方法和类方法(在其他语言中称为静态方法)。在大多数情况下,方法是子例程subroutine
    • Parameters 参数 — 参数定义供此类使用的常量值。该值是在编译时设置的。
    • Properties 属性——属性包含类实例的数据。
    • Class queries 类查询 — 类查询定义可由该类使用的 SQL 查询,并指定用作查询容器的类。
    • XData blocksXData 块是类中格式良好的 XML 文档,供类使用。
    • 仅与持久类相关的其他类型的类成员。

    IRIS 类定义使用类定义语言 (CDL) 来指定类及其成员。可以使用 PythonObjectScript 在方法内部编写可执行代码。

    类定义可以包含关键字;这些会影响类编译器的行为。可以为整个类指定一些关键字,为特定类成员指定其他关键字。这些关键字影响类编译器生成的代码,从而控制类的行为。

    下面显示了一个简单的 IRIS 类定义,其中包含用 ObjectScriptPython 编写的方法:

    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
            }
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    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)
    }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    请注意以下几点:

    • 第一行给出了类的名称。 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() 语法。该示例显示了两种语法形式。
    • VariableMessageMessageCount 是属性。 As 后面的项目指示这些属性的类型。 InitialExpressionRequired 是编译器关键字。

    可以直接从 ObjectScriptPython 访问 IRIS 类属性,如示例中所示。

    • HelloWorld() 是一个类方法,它返回一个字符串;这由 As 后面的项目表示。

    此方法使用类参数的值。

    • WriteIt() 是一个实例方法,它不返回值。

    此方法使用类参数的值和两个属性的值。

    ServerOnly 编译器关键字意味着该方法不会投射到外部客户端。

    以下终端会话显示了我们如何使用此类。两个终端 shell 对于该类的 ObjectScriptPython 版本均有效。

    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?
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    >>> 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?
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    Java基础之《网站跨域问题》
    如何做一个基于 Python 的搜索引擎?
    内边距(padding会影响盒子内边距大小)
    uniapp如何上传文件,使用API是什么
    使用pytorch搭建lstm时间序列预测
    计算机毕业设计基于SSM的健身房管理系统程序设计/项目定制/调试运行
    zabbix配置钉钉告警(附含钉钉告警脚本 · 实战亲测无任何问题)
    IntelliJ IDEA 2022.2保姆级安装教学
    day05_编译原理学习
    Vue 路由传参和获取参数的方法
  • 原文地址:https://blog.csdn.net/yaoxin521123/article/details/132751941