目录
类
抽象类
使用 Abstract
关键字指定
- 如果类是抽象的,则无法创建该类的实例。
- 抽象类通常不指定类的类型。
Class MyClass [ Abstract ]
{
}
最终类
使用 Final
关键字指定最终类
- 一个类是最终的,它不能有子类。
- 如果省略此关键字,则类定义不是最终的。
Class MyApp.Exam As %Persistent [ Final ]
{
}
左/右继承
用关键字Inheritance
指定此类的超类的继承顺序( left
/ right
)
Caché
使用默认的继承方向(left
),最左边列出的超类始终是主超类,而不考虑继承顺序。- 当成员冲突时,以主超类为主
Class MyApp.MyClass Extends (MySuperClass1, MySuperClass2) [ Inheritance = left ]
{
//class members
}
类
私有属性
使用Private
关键字
- 私有属性在类文档中是显示不出来的
Property Name As %String [ Private ];
只读 ReadOnly
如果你希望一个类的成员变量,只能通过get
和set
来进行读取,那么就设置该成员为ReadOnly
- 在
get
和set
中,引用类的成员变量,只能使用i%
的方式
Property Name As %String [ Private, ReadOnly ];
Method NameGet() As %String [ServerOnly = 1 ]
{
Quit i%Name
}
Method NameSet(Arg As %String) As %Status [ ServerOnly = 1 ]
{
s i%Name = Arg
Quit $$$OK
}
最终属性
用关键字Final
指定此属性是否为最终属性(不能在子类中重写)。
Property name As classname [ Final ];
属性初始指
用关键字InitialExpression
指定此属性的初始值。
Property name As classname [ InitialExpression = initialexpression ];
其中,初始表达式 是常量或用大括号括起来的 Caché ObjectScript
表达式。
- 此关键字指定属性的初始值。此值由创建新实例时类的
%New()
方法分配。(如果属性是暂时性的,则其初始值由创建实例时由%New()
调用的代码确定,或在将实例从磁盘加载到内存中时由%OpenId()
调用的代码确定。 - 子类继承 InitialExpression 关键字的值,并且可以覆盖它。
- InitialExpression 关键字的默认值为 null。
必需属性
对于持久性类,指定必须先为属性的值赋值,然后才能将其存储到磁盘。对于启用 XML
的类,指定属性映射到的元素是必需的。使用Required
指定
Property name As classname [ Required ];
方法
构造方法
默认构造方法无参数,如果在创建类实例时候,需要传参做内部的一些操作可通过重写构造方法%OnNew
来实现
Method %OnNew(arg As %String) As %Status [ Private, ServerOnly = 1 ]
{
d ..NameSet(arg)
Quit $$$OK
}
内部方法
使用 Internal
关键字指定
- 内部类成员不会显示在类文档中。如果您希望用户查看某个类,但看不到其所有成员,则此关键字很有用。
- 如果省略此关键字,则此方法将显示在类文档中。
ClassMethod Test() As %String [ Internal ]
{
Quit $$$OK
}
不可继承
使用NotInheritable
关键字指定:此方法不能在子类中继承。
- 如果省略此关键字,则此方法是可继承的。
- 虽然在某些情况下,让成员不能被其子类继承非常有用,但关键字应该很少且明智地使用,因为它会破坏继承契约。
ClassMethod Test() As %String [ NotInheritable ]
{
Quit $$$OK
}
私有方法
用关键字Private
指定此方法是否为私有方法(只能由此类或其子类的方法调用)。
- 私有类成员只能由同一类(或其子类)的其他成员使用。此关键字是继承的,但您可以在子类中更改其值。
- 在类文档中也查看不到私有方法
- 在Terminal中运行不了,提示PRIVATE METHOD
ClassMethod Test() As %String [ Private ]
{
Quit $$$OK
}
最终方法
使用关键字Final
指定。
- 标记为最终状态的类成员不能在子类中重写。
- 省略此关键字或将单词 Not 放在关键字的正前方,表示不是最终方法
ClassMethod Test() As %String [ Final ]
{
Quit $$$OK
}
抽象方法
用关键字 Abstract
指定
- 抽象方法没有实现,也没有为其生成的可执行代码,即:空方法
- 抽象方法的存在仅用于定义可以在一个或多个子类中重写和实现的方法签名(或接口)。
Method MyMethod() [ Abstract ]
{
}
注意点
生成set和get方法
定义类属性时,在最后一步,勾上底下的两个复选框,即可
- Override the Set method for this property
- Override the Get method for this property
引用类属性
大体分为三种方式:i%
、..
、$this
- 老版本的使用
%this
s i%Name = Arg [在get和set方法中使用]
s ..Name="" [在本类或子类的非get和set方法中,]
s $this.Name="" [在 %OnNew 构造方法中使用或本来非get和set方法中]
子类调用父类的同名方法
使用##super()
方式进行调用
d ##super(arg...)