我在OCaml中有这两个类
class type ['a] collection =
object
method add : 'a -> unit
method clear : unit -> unit
method iterator : unit -> 'a iterator
method remove : 'a -> unit
end
class type ['a] iterator =
object
method hasNext : unit -> bool
method next : unit -> 'a
end
我需要创建两个具体类['a] queue
子类型collection
和['a] iterator_queue
子类型iterator
。
我想主要知道如何定义方法iterator : unit -> 'a iterator
,因为我没有看到这两种类型是如何连接的,['a] iterator_queue
是否必须从两个类型中继承?或者我应该采取不同的行动。
答案 0 :(得分:4)
可能最简单的方法是将迭代器定义为队列定义范围内的对象(在Java中,这将被称为“内部类”)。例如:
class ['a] queue : ['a] collection =
object
val q = ref []
(* definitions of add, clear, remove *)
method iterator () : 'a iterator =
object
val lst = ref !q
(* definitions of hasNext and next *)
end
end
请注意,lst
是q
在iterator
被调用时对(不可变)值的引用。对队列的后续更改不会反映在迭代器中。
答案 1 :(得分:1)
我怀疑这可能仅仅是对相互递归类定义的测试。
class ['a] queue =
object
inherit 'a container
method iterator = new iterator_queue args
...
end
and ['a] iterator_queue args =
object
...
end