2010-01-02 52 views
5

一個迭代關聯到集合我有兩個班在OCaml中如何在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_queueiterator亞型。

我主要想知道如何定義方法iterator : unit -> 'a iterator,因爲我沒有看到這兩種類型可以連接,['a] iterator_queue必須從兩個抽象的繼承?還是應該以不同的方式進行

回答

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是在該iterator被稱爲時間的q的(不可變)值的引用。對隊列的後續更改將不會反映在迭代器中。

+1

我想到的其中一種方法是這樣做的,但這是考試的主題,我試圖找到解決方案;) – 0xFF 2010-01-03 11:19:50

1

我懷疑這可能只是一個相互遞歸類定義的測試。

class ['a] queue = 
    object 
    inherit 'a container 
    method iterator = new iterator_queue args 
    ... 
    end 
and ['a] iterator_queue args = 
    object 
    ... 
    end