Sostanzialmente craiamo il costruttore della classe.
-Se l'istanza non ha <Fields> allora si crea un istanza con una lista vuota.
-Se abbiamo il campo <Fields> dobbiamo prima controllare che non esista già la stessa istanza.
-Se esiste non si procede con l'operazione, in quanto rindondante, in caso contrario si passa alla creazione effettiva del metodo.
-Se fallisce la creazione del metodo si elimanano le eventuali informazioni residue dalla base di conoscenza.
+Prima di creare l'istanza si controlla che l'atono non sia già un'istanza di una classe.
+Se esiste non si procede con l'operazione, in quanto rindondante, in caso contrario si passa alla creazione effettiva dell'istanza.
+
+Dopo di che:
+- Se non viene dato il campo /Fields/ allora si crea un istanza con i valore di default della classe.
+- Se abbiamo il campo /Fields/ associamo ai fields dell'istanza i valori di default e successivamente quelli presenti in /Fields/.
+- Se fallisce la creazione dell'istanza si elimanano le eventuali informazioni residue dalla base di conoscenza.
*** Implementazione
** field
*** Definizione
-Estrae il valore di una classe da un campo.
+Assegna dinamicamente ed estrae il valore di un field di un'istanza.
-Questa funzione svolge lo stesso compito di un getter,
-ovvero una funzione che fornisce un modo controllato per accedere al valore di un attributo, all'interno di una classe.
+Questa funzione svolge lo stesso compito di un getter/setter in un *inferiore* linguaggio ad oggetti, ovvero una funzione che fornisce un modo controllato per accedere al valore di un attributo all'interno di un'istanza.
*** Implementazione
#+begin_src prolog :tangle oop.pl
** fieldx
*** Definizione
Estrae il valore dalla classe percorrendo una catena di attributi.
-Il caso base del metodo è quando <FieldName>+ è una lista formata da un solo elemento, con un field possiamo estrattre l'ultimo (e solo) valore di <FieldName>+
-Se <FieldName>+ ha più elementi possiamo richiamare il metodo ricorsivamente sulla coda della lista finchè la lista non avrà un solo elemento riportandoci al caso base.
+Il caso base del metodo è quando /FieldName/ è una lista formata da un solo elemento, con il predicato /field/ possiamo estrattre l'ultimo (e solo) valore di /FieldName./
+Se /FieldName/ ha più elementi possiamo richiamare il metodo ricorsivamente sulla coda della lista finchè la lista non avrà un solo elemento riportandoci al caso base.
*** Implementazione
#+begin_src prolog :tangle oop.pl
!.
fieldx(Instance, [FieldName | Others], Res) :-
is_instance(Instance),
- field(Instance, FieldName, _Value),
- fieldx(Instance, Others, Res).
+ field(Instance, FieldName, Value),
+ fieldx(Value, Others, Res).
#+end_src
*** Esempio pratico