« Programmation Ruby/Héritage » : différence entre les versions

Contenu supprimé Contenu ajouté
exemple héritage, accession aux méthodes parentes/héritière
<source> + ortho + formulation standard POO
Ligne 2 :
[[Programmation Ruby/Objets|<< Retour à programmation objet]]
 
L'héritage permet de créer une classe à partir d'une autre pour l'enrichir, ou la spécialiser. Une classe (classe dérivée, ou classe fille) hérite d'une autre classe (classe de base, ou classe mère).
Cela permet d'avoir des classes génériques (classe parente) et des classes spécialisées (classes héritières).
 
On peut toujours utiliser les méthodes de la (des) classe(s) parentemère(s) Dansdans une classe héritéedérivée.
 
L'opérateur <code>&lt;</code> précède le nom de la classe étenduede base.
 
== Exemple ==
La classe <code>Point</code> vue précédemment :
<source lang="ruby">
class Point
def initialize( x, y )
def initialize( @x, =y x)
@yx = yx
end @y = y
end
def coords
puts "x : #{@x}"
puts "y : #{@y}"
end
end
</source>
 
peut être dérivée en une classe <code>PointColore</code> représentant un point coloré.
Cette classe possède donc un attribut supplémentaire pour la couleur :
<source lang="ruby">
class PointCouleur < Point
def initialize( x, y, couleur )
def initialize( x, y, couleur )
super(x,y) # appel au constructeur de la classe Point
@couleur = couleur
end
def couleur
puts "couleur : #{@couleur}"
end
end
</source>
 
Lorsqu'on crée une instance de la classe héritéedérivée, on bénéficie immédiatement des méthodes de celle-ci :
<source lang="ruby">
pc = PointCouleur.new(1,2,"rouge")
pc.couleur
pc.couleur
# => couleur : rouge
</source>
 
Et les méthodes de la classe parentede base étant héritées, on pourra la réutiliser dans la classé héritéeclasse dérivée:
<source lang="ruby">
pc.coords
=> x : 1
# => yx : 21
# => xy : 12
</source>
 
Par contre, la classe parente,de base ne possède pas les méthodes définies dans les classeclasses héritièresdérivées.
<source lang="ruby">
p1 = Point.new
p1.couleur
=> NoMethodError: undefined method `couleur' for #<Point:0xb7c059b0 @x=0, @y=0>
</source>