У меня есть эти два класса в 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
должен быть наследован от обоих абстрактные? или если я продолжаю двигаться по-другому.
Я подозреваю, что это может быть просто тестом на определение рекурсивных классов.
class ['a] queue =
object
inherit 'a container
method iterator = new iterator_queue args
...
end
and ['a] iterator_queue args =
object
...
end
Вероятно, самый простой способ сделать это - определить итератор как объект в рамках определения очереди (в 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
в момент вызова итератора
. Последующие изменения очереди не будут отражены в итераторе.