2013-07-16 14 views
9

Quali sono le differenze tra Modulo e Classe in OCaml.Modulo e classe in OCaml

Dalla mia ricerca, ho trovato questo:

Entrambi forniscono meccanismi per l'astrazione e l'incapsulamento, per subtyping (omettendo metodi negli oggetti, e omettendo campi in moduli), e per l'eredità (oggetti di uso inherit; i moduli usano includono). Tuttavia, i due sistemi non sono comparabili. Da un lato, gli oggetti hanno un vantaggio: gli oggetti sono valori di prima classe e i moduli non lo sono, in altre parole, i moduli non supportano la ricerca dinamica . D'altro canto, i moduli hanno un vantaggio: i moduli possono contenere definizioni di tipo e gli oggetti non possono.

In primo luogo, non capisco cosa significhi "I moduli non supportano la ricerca dinamica". Da parte mia, astrazione e polimorfismo significano che il puntatore genitore può fare riferimento a un'istanza child. È la "ricerca dinamica"? In caso contrario, che cosa significa in realtà ricerca dinamica?

In pratica, quando si sceglie di utilizzare il modulo e quando si è in classe?

risposta

8

Dal punto di vista pratico, la ricerca dinamica consente di avere oggetti diversi con lo stesso metodo senza specificare a quale classe/modulo appartiene. Ti aiuta quando usi l'ereditarietà.

ad esempio, consente di utilizzare due strutture dati: SingleList e DoubleLinkedList, che, entrambi, ereditare da List e hanno il metodo pop. Ogni classe ha la propria implementazione del metodo (a causa della 'override').

Così, quando si voglia chiamare, la ricerca del metodo è fatta in fase di esecuzione (anche noto come dinamicamente) quando si esegue un list#pop.

Se si sta utilizzando moduli che si dovrebbe usare SingleList.pop list o DoubleLinkedList.pop list.

EDIT: Come @ Majestic12 ha detto, il più delle volte, gli utenti OCaml tendono a utilizzare i moduli su classi. Usando il secondo quando hanno bisogno di ereditarietà o istanze (controlla la sua risposta).

Volevo rendere la descrizione pratica come sembra nuova a OCaml.

Spero che possa aiutarti.

11

La differenza principale tra modulo e classe è che non si istanzia un modulo.

Un modulo è fondamentalmente solo un "cassetto" in cui è possibile inserire tipi, funzioni, altri moduli, ecc. È solo qui per ordinare il codice. Questo cassetto è tuttavia davvero potente grazie ai funtori.

Una classe, d'altra parte, esiste per essere istanziata. Contengono variabili e metodi. È possibile creare un oggetto da una classe e ogni oggetto contiene una propria variabile e metodi (come definito nella classe).

In pratica, utilizzare un modulo sarà una buona soluzione per la maggior parte del tempo. Una classe può essere utile quando hai bisogno di ereditarietà (ad esempio i widget).