Frage

Ich versuche, eine gegenseitige Bindung zwischen zwei Klassen in OCaml (a la Mediator Muster der) und sind immer einen Fehler bei der Zusammenstellung zu erreichen.

class virtual ['mediator] colleague mIn = object 
 val m = mIn
 method virtual getmediator : 'mediator
end;;

class concreteColleague mIn = object inherit colleague 
 method getmediator = m
end;;

(* Some other classes here *)

class mediator = object (self)
 val mutable myColleague = (None:colleague option)
 initializer 
  myColleague <- Some (new concreteColleague self)
end;;

Fehler: Der Klassenkonstruktor Kollege erwartet 1 Typargument (n), aber hier wird angewendet auf 0 Typ Argumente

.

Ich kann nicht sagen, dass ich alles so vertraut mit der [ 'foo] Syntax in der Klassendefinition aber habe sie (ohne Erfolg) Zuflucht bei dem Versuch, dem Vermittler zu ermöglichen, einen Verweis auf alle Kollegen zu halten und jeder Kollege mit seinem jeweiligen Vermittler bei dem Versuch, auch die Bedeutung einer Klasse Definition im Quellcode zu überwinden. Wie gehe ich über die Kollegen damit einen Hinweis auf ihre Vermittler zu halten?

War es hilfreich?

Lösung

Ich reparierte die alle Kompilierung Probleme. Wenn Sie von Kollegen geerbt, müssen Sie die Typparameter liefern. Als Ergebnis muss concreteColleague ich glaube auch, einen Typparameter. Auch vergessen Sie den Konstruktor Argument mIn auf die geerbte Klasse zu übergeben. Und Ich habe einen Typ-Parameter auf Ihren Typ-Schutz für myColleague, den Typ des Objekts.

class virtual ['mediator] colleague mIn = object 
 val m = mIn
 method virtual getmediator : 'mediator
end;;

class ['mediator] concreteColleague mIn =
 object inherit ['mediator] colleague mIn
 method getmediator = m
end;;

(* Some other classes here *)

class mediator = object (self : 'self)
 val mutable myColleague = (None:'self colleague option)
 initializer 
  myColleague <- Some (new concreteColleague self)
end;;

Allerdings bin ich mit den Vermittler-Mustern nicht vertraut, so dass ich bin nicht sicher, was der richtige Weg ist, um die Vermittler-Muster zu implementieren. Sind Sie sicher, dass Sie benötigen Objekte und virtuelle Klassen und so?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top