Nella "guida Ruby" abbiamo già incontrato i moduli ed abbiamo visto un semplice esempio di mixin. In questo articolo approfondiamo l'utilizzo dei moduli e della parola chiave include, con ulteriori implementazioni dell'ereditarietà multipla. Vediamo anche come modificare il comportamento delle istanze, oltre che delle classi, grazie ad extend e come realizzare metodi singleton.
Iniziamo subito con la funzione principale del mixin: quella di permettere l'ereditarietà multipla attraverso i moduli e il metodo include. Prendiamo ad esempio un modello del comportamento dei cani.
module Aggressive
def snarl
"Grrr."
end
end
class Dog
include Aggressive
def bark
"Bau, bau."
end
end
I metodi d'istanza del modulo Aggressive saranno ereditati dagli oggetti della classe Dog come metodi d'istanza.
> Dog.included_modules => [Aggressive, Kernel] > Dog.instance_methods => ["bark", "snarl", ...] > rowdy = Dog.new => #<Dog:0xb7c63f4c> > rowdy.bark => "Bau, bau." > rowdy.snarl => "Grrr."
L'output di Dog.instance_methods è ridotto per questioni di spazio e chiarezza.
Internamente quando includiamo un modulo, Ruby crea, a partire dai suoi metodi, una classe che diviene l'immediato antenato della nostra classe. Ad esempio se abbiamo una classe Dog che ha come classe padre Animal
Dog <- Animal
Aggressive avremo indicativamente una situazione del genere:
Dog <- Aggressive <- Animal
Senza l'inclusione del modulo
> Dog.ancestors => [Dog, Animal, Object, Kernel]
Dopo l'inclusione del modulo "Agressive"
> Dog.ancestors => [Dog, Aggressive, Animal, Object, Kernel]
Ogni mercoledì, direttamente nella tua e-mail: articoli, guide e tutorial su Ruby e Ruby on Rails .
Iscriviti alla newsletter
|
Nessun corso previsto |
|
|
Corso Amministratore Linux15 Febbraio 2010 a Roma |