Il modello di progettazione del mediatore in OCaml
-
03-07-2019 - |
Domanda
Sto cercando di realizzare un legame reciproco tra due classi in OCaml (a la Mediator Pattern's) e ricevo un errore al momento della compilazione.
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;;
Errore: il collega del costruttore della classe si aspetta 1 argomenti di tipo, ma è qui applicato a 0 argomenti di tipo.
Non posso dire di avere familiarità con la sintassi ['pippo] nella definizione della classe, ma ho fatto ricorso ad essa (senza alcun risultato) nel tentativo di consentire al mediatore di mantenere un riferimento a tutti i colleghi e ogni collega al rispettivo mediatore mentre cerca anche di superare l'importanza della definizione di una classe nel codice sorgente. Come posso consentire ai colleghi di mantenere un riferimento al loro mediatore?
Soluzione
Ho risolto tutti i problemi di compilazione. Quando hai ereditato da un collega, devi fornire il parametro del tipo. Di conseguenza, credo che concreteColleague abbia bisogno anche di un parametro di tipo. Inoltre, hai dimenticato di passare l'argomento costruttore mIn alla classe ereditata. E ho aggiunto un parametro type al tuo tipo guard per myColleague, usando il tipo di oggetto.
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;;
Tuttavia, non ho familiarità con il modello del mediatore, quindi non sono sicuro di quale sia il modo corretto di implementare il modello del mediatore. Sei sicuro di aver bisogno di oggetti e classi e cose virtuali?