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?

È stato utile?

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top