第1集丨IRIS 面向对象编程基础知识

抽象类

使用 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

如果你希望一个类的成员变量,只能通过getset来进行读取,那么就设置该成员为ReadOnly

  • getset中,引用类的成员变量,只能使用 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   [getset方法中使用]
s ..Name=""      [在本类或子类的非getset方法中,]
s $this.Name="" [%OnNew 构造方法中使用或本来非getset方法中]

子类调用父类的同名方法

使用##super() 方式进行调用

d ##super(arg...)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值