Die Mediator Design Muster in OCaml
-
03-07-2019 - |
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?
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?