Découverte de Ruby - Partie II
Commençons par créer une classe et un objet. La méthode initialize correspond à notre constructeur. Les variables préfixées par @ sont des variables d'instances (servant à définir un état pour chaque objet créé). La méthode new habituelle sert à construire l'objet en invoquant initialize avec les bons arguments.
class Mammifere
def initialize( unNom )
@nom = unNom
end
end
lesChiens = Mammifere.new( "Chien" )
Pour observer l'état de notre objet, on dispose de la fonction inspect.
puts lesChiens.inspect
On obtient alors : #<Mammifere:0x2b69318 @nom="Chien">
La méthode to_s sert à obtenir un identifiant de l'objet (façon toString en java). On peut la surcharger.
class Mammifere
def initialize( nom )
@nom = nom
end
def to_s()
return @nom
end
end
lesChiens = Mammifere.new( "Chien" )
# On obtient en sortie le nom
puts lesChiens
Il est possible de compléter une définition de classe ailleurs par exemple :
class Mammifere
def qui()
puts "Les #{@nom}"
end
end
Les objets de la classe Mammifere ont alors à disposition la méthode qui même s'ils ont été créés avant.
Héritage
L'héritage est obtenu par l'opérateur <. La surcharge d'un constructeur se fait en réécrivant une méthode initialize et le mot-clé super désigne le constructeur parent.
class MammifereTerrestre < Mammifere
def initialize( nom, nbPatte )
super( nom )
@patte = nbPatte
end
end
Lorsque l'on surcharge une méthode, l'appel à la méthode parente se fait aussi par le mot-clé super. Ci-dessous une surcharge de la méthode to_s().
class MammifereTerrestre < Mammifere
def initialize( nom, nbPatte )
super( nom )
@patte = nbPatte
end
def to_s()
"#{super()} avec #{@patte} pattes"
end
end
A note que le mot-clé return n'est pas obligatoire.
Un attribut n'est pas accessible en lecture. Pour accéder à la valeur d'un attribut, on peut bien sûr créer une fonction de lecture qui retourne cette valeur, mais plus simplement le mot-clé attr_reader va indiquer à Ruby de créer lui-même ces fonctions.
class MammifereTerrestre
attr_reader :nom, :patte
end
puts lesChats.nom
Voici le code qui monde clairement que Ruby a ajouté du code :
class VerifMammifereTerrestre < MammifereTerrestre
def nom
puts "Accès à la surcharge de nom"
super
end
end
lesChats = VerifMammifereTerrestre.new( "Chat", 4 )
puts lesChats.nom
Maintenant si nous souhaitons modifier la valeur d'un attribut, on dispose également d'une astuce qui donne l'illusion qu'il n'y pas de fonction pour modifier sa valeur.
class MammifereTerrestre
def nom=(evolution)
@nom=evolution
end
end
lesChats.nom = "Petit chat"
puts lesChats.nom
On peut également utiliser le mot-clé attr_writer avec la même syntaxe de attr_reader pour laisser Ruby générer ces méthodes.
Variables et méthodes de classe
Les variables de classes commençent par @@ et doivent toujours être initialisées. Les méthodes de classes commençent par le nom de la classe.
class Mammifere
@@compteur = 0
def initialize(nom)
super( nom )
@@compteur+=1
end
def Mammifere.combien
@@compteur
end
end
puts Mammifere.combien
Contrôle d'accès
Grâce aux mot-clés private, protected, public vous allez gérer les accès aux attributs et méthodes de la classe. On peut les employer pour créer des groupes ou leur passer des "références" de méthodes.
class Mammifere
private
def leNourir()
puts "miam miam"
end
private :qui
public
def quelAnimal?
qui
leNourir
end
end