Wie

2010-01-02 3 views
5

einen Iterator zu einer Sammelstelle in OCaml zu assoziieren Ich habe diese beiden Klassen in OCamlWie

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 

Und ich brauche zwei konkrete Klassen ['a] queue Subtyp von collection und ['a] iterator_queue ein Subtyp von iterator zu erstellen.

Ich möchte hauptsächlich wissen, wie man die Methode iterator : unit -> 'a iterator definiert, weil ich nicht sehe, wie die zwei Arten verbunden werden können, Muss die ['a] iterator_queue von den abstrakten geerbt werden? oder sollte ich anders vorgehen?

Antwort

4

Der einfachste Weg, dies zu tun, ist, den Iterator als ein Objekt im Rahmen der Definition der Warteschlange zu definieren (in Java würde dies eine "innere Klasse" genannt werden). Zum Beispiel:

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 

Beachten Sie, dass lst ist ein Verweis auf den (unveränderlich) Wert von q zu dem Zeitpunkt, iterator genannt wird. Nachfolgende Änderungen an der Warteschlange werden nicht im Iterator widergespiegelt.

+1

Eine der Möglichkeiten, an die ich dachte, war, dies zu tun, aber das ist ein Thema einer Prüfung, für die ich versuche, die Lösung zu finden;) – 0xFF

1

Ich vermute, dies könnte einfach ein Test von gegenseitig rekursiven Klassendefinitionen sein.

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