Classi
Il mondo reale è pieno di oggetti che possiamoclassificare. Ad esempio, un bambino molto piccoloprobabilmente dice "bau bau" quando vede un cane,incurante della razza; noi naturalmente vediamo il mondo intermini di queste categorie.
Nella terminologia della programmazione OO, una categoria dioggetti come il "cane" è chiamataclasse, ed alcuni specifici oggetti appartenenti aduna classe sono chiamati istanze di quella classe.
Generalmente, per creare un oggetto in ruby o in qualsiasialtro linguaggio OO, bisogna prima definire lecaratteristiche della classe, e quindi creare unainstanza. Per illustrare il processo, lasciatemi primadefinire una semplice classe Cane
.
ruby> class Cane | def abbaia | print "Bau Bau" | end | end nil
In ruby, la definizione di una classe è una regione dicodice tra le parole chiave class
eend
. La parola chiave def
all'interno di questa regione inizia la definizione di unmetodo della classe, che come abbiamo detto nelcapitolo precedente, corrisponde a qualche specificocomportemento di un oggetto di quella classe.
Ora che abbiamo definito una classe Cane
,possiamo usarla per fare un cane:
ruby> fido = Cane.new #<Cane:0xbcb90>
Abbiamo creato una nuova istanza della classeCane
, e l'abbiamo chiamatafido
. Il metodo new
di ogniclasse crea una nuova istanza. Poichéfido
è un Cane
in accordoalla definizione della nostra classe, ha le proprietàche noi decidiamo debba avere un Cane
. Poiché la nostra idea di Cane
èmolto semplice, c'è solo una cosa che possiamochiedere a fido
di fare.
ruby> fido.abbaiaBau Bau nil
Creare una nuova istanza di una classe è talvoltadetto istanziare quella classe. Dobbiamo avereun cane prima di avere il piacere della sua conversazione;non possiamo semplicemente chiedere alla classe Canedi abbaiare per noi.
ruby> Cane.abbaiaERR: (eval):1: undefined method `abbaia' for Cane:class
Non ha più senso che cercare di mangiare ilconcetto di sandwich.
D'altra parte, se vogliamo ascoltare il suono di un canesenza avere legami affettivi, possiamo creare (istanziare) uncane effimero e temporaneo, e ottenere un piccolo rumore daesso prima che sparisca.
ruby> (Cane.new).abbaia # o più comunemente, Cane.new.abbaiaBau Bau nil
"Aspetta," starete dicendo, "cos'èquesta storia di questo poveretto che scompare subitodopo?" E' vero: se non ci prendiamo il fastidio didargli un nome (come abbiamo fatto per fido
),l'automatic garbage collection di ruby decide cheè un cane abbandonato, e spietatamente se nedisfà. In realtà questo è giustoperché non possiamo avere tutti i cani che vogliamo.