Domanda

Sto cercando di capire la sintassi del linguaggio OCaml e ho qualche problema con l'applicazione di alcune strutture OOP. Il mio obiettivo con il codice seguente è quello di avere una barra di classe che eredita da un foo di classe virtuale. La classe virtuale contiene tre metodi virtuali che spero di prendere un'istanza di un & Quot; player & Quot; oggetto come parametro. Quando compilo il codice seguente, viene visualizzato l'errore: Il metodo doThis ha tipo 'a - & Gt; 'b ma dovrebbe avere un giocatore di tipo. Cosa significa (ricorda, sono nuovo in questo) e come posso correggerlo?

Grazie!

class player =
object

end;;

class virtual foo =
object (self)
 method virtual doThis : player
 method virtual doThat : player
 method virtual notifyAll : player array
end;;

class bar (playersIn: player array) =
object (self)
 inherit foo
 method doThis (p:player) = Printf.printf "%s\n" "This!"
 method doThat (p:player) = Printf.printf "%s\n" "That!"
 method notifyAll (p:player array) = Printf.printf "%s\n" "Notifying!"
end;;
È stato utile?

Soluzione

(Non conosco OCaml, ma conosco F # e sono simili, quindi speriamo di indovinare.)

Prova a cambiare

method virtual doThis : player 
method virtual doThat : player 
method virtual notifyAll : player array

a

method virtual doThis : player -> unit
method virtual doThat : player -> unit
method virtual notifyAll : player array -> unit

Altri suggerimenti

Credo che la risposta precedente sia corretta: i metodi in questione hanno bisogno che i loro tipi siano funzioni che restituiscono unità.

Un altro consiglio più generale: non iniziare ad imparare OCaml iniziando a imparare il sistema di oggetti. Gli oggetti in OCaml possono essere utili, ma i casi in cui si desidera veramente programmare con oggetti sono pochi e lontani tra loro. E non sarai in grado di comprendere il sistema a oggetti di OCaml fino a quando non avrai una buona conoscenza del linguaggio principale. Concentrati su come risolvere i tuoi problemi utilizzando tipi di dati algebrici di base (varianti, tuple, record), polimorfismo parametrico ordinario (al contrario del sottotipo che vedi con varianti e oggetti polimorfici) e moduli (ma non funzioni).

Comprendi questi strumenti di base prima di giocare con gli oggetti. La maggior parte dei problemi che risolveresti con oggetti in altre lingue sono risolti meglio in OCaml senza di essi.

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