98. 面向对象的LotusScript(十七)之LinkedCollection

2024-02-01 18:38

本文主要是介绍98. 面向对象的LotusScript(十七)之LinkedCollection,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

面向对象编程经常会用到作为容器的对象,使用LotusScript时因为基本上是和单一的数据对象NotesDocument打交道,用作容器的就是数据库的视图或包含搜索结果的文档集合。但有时也需要某个通用容器来容纳其他自定义的对象。此时一般可考虑用数组,或者像20. 面向对象的LotusScript(三)之NArray介绍的编写一个基于动态数组的容器类。本文给出另一种容器的实现方式,对外的接口也像NArray一样是一个Collection,内部实现则不依赖于数组,而采用链接的节点。由于LotusScript的数组在包含数组时有层次上的限制,所以本容器类在理论上适用范围更广(虽然极少遇到这样极端的情况,基本上还是作为一个普通的容器类使用)。

'先定义一个用作节点的类
Class LinkedNodePublic PreviousNode As LinkedNodePublic NextNode As LinkedNodePublic Value As Variant'prevNode As LinkedNode, nextNode As LinkedNodeSub New(value As Variant)Call SetValue(me.Value, value)End Sub Sub Append(nnode As LinkedNode)Set me.NextNode=nnodeSet nnode.PreviousNode=MeEnd Sub Function IsEqualTo(node As LinkedNode) As BooleanIf node Is Me ThenIsEqualTo=TrueExit Function End IfIf Equals(node.Value, me.Value) ThenIsEqualTo=TrueElseIsEqualTo=False             End IfEnd Function
End Class
'接下来是链接集合类
Class LinkedCollectionPrivate msize As IntegerPrivate anchor As LinkedNodePrivate current As LinkedNode'Public Parent As LinkedCollectionSub New()Set anchor=New LinkedNode(Null)Call anchor.Append(anchor)Call Me.Reset()'Set anchor.PreviousNode=anchor'Set anchor.NextNode=anchorEnd SubProperty Get Size As IntegerSize=msizeEnd PropertyFunction FirstNode() As LinkedNodeDim node As LinkedNodeSet node=anchor.NextNodeIf Not anchor.NextNode Is anchor ThenSet FirstNode=anchor.NextNodeEnd IfEnd FunctionFunction LastNode() As LinkedNodeIf Not anchor.PreviousNode Is anchor ThenSet LastNode = anchor.PreviousNodeEnd If End FunctionSub Reset()Set current=anchorEnd SubFunction HasNext() As BooleanHasNext=Not current.NextNode Is anchorEnd FunctionFunction Next() As LinkedNodeSet current=current.NextNodeIf current Is anchor ThenSet Me.Next=Nothing 'Error 4000, "LinkedList: no such element."End IfSet Me.Next=currentEnd Function Function Add(value As Variant)Dim node As New LinkedNode(value)Call anchor.PreviousNode.Append(node)Call node.Append(anchor)msize=msize+1End FunctionFunction Contains(value As Variant) As BooleanIf Find(value) Is Nothing ThenContains=FalseElseContains=True End IfEnd FunctionFunction ContainsNode(node As LinkedNode) As BooleanCall Me.Reset()While HasNext()If Me.Next() Is node ThenContainsNode=True   End IfWend        ContainsNode=False End FunctionFunction Remove(value As Variant) As BooleanDim node As LinkedNodeSet node=Find(value)If node Is Nothing ThenMe.Remove=False ElseCall DirectRemoveNode(node)Me.Remove=True End If      End FunctionFunction RemoveCurrent() As BooleanIf current Is anchor ThenRemoveCurrent=FalseElseCall DirectRemoveNode(current)Set current=current.PreviousNodeEnd IfEnd FunctionPrivate Sub DirectRemoveNode(node As LinkedNode)Call node.PreviousNode.Append(node.NextNode)msize=msize-1       End SubFunction Find(value As Variant) As LinkedNodeDim node As LinkedNode Call Me.Reset()While HasNext()Set node=Me.Next()If Equals(value, node.Value) ThenSet Find=nodeExit Function End IfWend        End FunctionFunction Clone() As LinkedCollectionDim col As New LinkedCollection'Dim node As LinkedNodeCall Me.Reset()While HasNext()Call col.Add(Me.Next().Value)   Wend'Set col.Parent=me.ParentSet Clone=colEnd FunctionFunction AddArray(array As Variant)ForAll e In arrayAdd(e)End ForAllEnd Function'The node value of two LinkedCollection instances must not point to their 'ancestors of LinkedCollection in the same hierarchy level. Or an infinite loop'will occur during comparing these two instances.   Function IsEqualTo(lc As Variant) As BooleanIf Not InstanceOf(lc, TypeName(Me)) ThenIsEqualTo=FalseExit Function           End IfIf lc Is Me ThenIsEqualTo=TrueExit Function           End IfIf lc.Size >< me.Size ThenIsEqualTo=FalseExit Function           End IfDim c1 As LinkedCollection, c2 As LinkedCollection      Set c1=Me.Clone()Set c2=lc.Clone()Call c1.Reset()Call c2.Reset()While c1.HasNext()If c2.Remove(c1.Next().Value) ThenCall c1.RemoveCurrent()             ElseIsEqualTo=FalseExit Function End IfWendIsEqualTo=True End Function
End Class

该集合类的方法从名称上都可以看出含义,包括添加单个值、添加数组、克隆、判断是否包含某值、查找包含某值的节点、返回首个节点、判断是否还有下个节点、用于比较等值的IsEqualTo、返回末个节点、返回下个节点、删除包含某值的节点、删除当前节点、重置内部指针以及返回集合包含节点的数量。
其中Reset、HasNext和Next三个方法合起来用于遍历集合内所有的节点:

Call col.Reset()
If col.HasNext() ThenSet node=col.Next()value=node.Value '或Set value=node.Value
End If

注意LinkedCollection和LinkedNode类都有一个IsEqualTo方法,可以被87. 再谈变体型Variant里介绍的计算相等性的Equals函数调用。
另外在LinkedCollection的链接实现方式上,采用了一个特殊的初始节点作为“锚”,使得对于从零到任意多个节点,在返回首位节点、添加节点、判断是否有下个节点等操作时,都有一致简单的逻辑。

这篇关于98. 面向对象的LotusScript(十七)之LinkedCollection的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/668114

相关文章

ffmpeg面向对象-待定

1.常用对象 rtsp拉流第一步都是avformat_open_input,其入参可以看下怎么用: AVFormatContext *fmt_ctx = NULL;result = avformat_open_input(&fmt_ctx, input_filename, NULL, NULL); 其中fmt_ctx 如何分配内存的?如下 int avformat_open_input(

chapter06 面向对象基础 知识点Note

文章目录 前言类的设计 属性和行为对象的内存解析 (堆 栈 方法区)类的成员之一 变量(属性) field类的成员之二 方法 method对象数组方法重载 overload可变个数的形参 语法糖方法的值传递机制递归关键字package importMVC设计模式import导入面向对象特征之一 封装类的成员之三 构造器JavaBeanUML类图 前言 ` 面向对象封装 面向

【JVM】JVM栈帧中的动态链接 与 Java的面向对象特性--多态

栈帧 每一次方法调用都会有一个对应的栈帧被压入栈(虚拟机栈)中,每一个方法调用结束后,都会有一个栈帧被弹出。 每个栈帧中包括:局部变量表、操作数栈、动态链接、方法返回地址。 JavaGuide:Java内存区域详解(重点) 动态链接 动态链接:指向运行时常量池中该栈帧所属方法的引用。 多态 多态允许不同类的对象对同一消息做出响应,但表现出不同的行为(即方法的多样性)。 多态

java基础总结15-面向对象11(抽象类)

下面通过一下的小程序深入理解抽象类 因此在类Animal里面只需要定义这个enjoy()方法就可以了,使用abstract关键字把enjoy()方法定义成一个抽象方法,定义如下:public abstract void enjoy();   从某种意义上来说,抽象方法就是被用来重写的,所以在父类声明的抽象方法一定要在子类里面重写。如果真的不想在子类里面重写这个方法,那么可以再在子类里

java基础总结14-面向对象10(多态)

面向对象最核心的机制——动态绑定,也叫多态 1 通过下面的例子理解动态绑定,即多态 package javastudy.summary;class Animal {/*** 声明一个私有的成员变量name。*/private String name;/*** 在Animal类自定义的构造方法* @param name*/Animal(String name) {this.name = n

java基础总结13-面向对象9(对象转型)

对象转型分为两种:一种叫向上转型(父类对象的引用或者叫基类对象的引用指向子类对象,这就是向上转型),另一种叫向下转型。转型的意思是:如把float类型转成int类型,把double类型转成float类型,把long类型转成int类型,这些都叫转型。把一种形式转成另外一种形式就叫转型。除了基础数据类型的转型之外(基础数据类型的转型:大的可以转成小的,小的也可以转成大的。),对象领域里面也有对象之

java基础总结12-面向对象8(Object类)

1 Object类介绍 Object类在JAVA里面是一个比较特殊的类,JAVA只支持单继承,子类只能从一个父类来继承,如果父类又是从另外一个父类继承过来,那他也只能有一个父类,父类再有父类,那也只能有一个,JAVA为了组织这个类组织得比较方便,它提供了一个最根上的类,相当于所有的类都是从这个类继承,这个类就叫Object。所以Object类是所有JAVA类的根基类,是所有JAVA类的老祖宗

java基础总结11-面向对象7(super关键字)

在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象。怎么去引用里面的父类对象呢?使用super来引用,this指的是当前对象的引用,super是当前对象里面的父对象的引用。 1 super关键字测试 package cn.galc.test;/*** 父类* @autho

java基础总结10-面向对象6(方法的重载)

1 方法的重载 方法名一样,但参数不一样,这就是重载(overload)。   所谓的参数不一样,主要有两点:第一是参数的个数不一样,第二是参数的类型不一样。只要这两方面有其中的一方面不一样就可以构成方法的重载了。 package cn.galc.test;public class TestOverLoad {void max(int a, int b) {System.out.prin