Las constantes son heredadas y pueden ser sobredominadas en la misma forma que los métodos.
~/rubytesting/TheRubyProgrammingLanguage/Chapter7ClassesAndModules$ cat -n InheritanceAndConstants.rb
1 class Point
2 def initialize(x,y)
3 @x,@y = x, y
4 end
5
6 ORIGIN = Point.new(0,0)
7
8 def to_s; "#@x #@y" end
9
10 def chuchu
11 puts ORIGIN
12 end
13 end
14
15 class Point3D < Point
16 def initialize(x, y, z)
17 super(x, y); @z = z
18 end
19 def to_s; super+" #@z" end
20
21 puts ORIGIN # 0 0
22 ORIGIN = Point3D.new(0, 0, 0)
23 puts ORIGIN # 0 0 0
24 puts Point::ORIGIN # 0 0
25
26 end
27
28 x = Point3D.new(1, 2, 3)
29 x.chuchu # 0 0
Obsérvese como la llamada al método chuchu
de la línea 29 muestra Point::ORIGIN y no
Point3D::ORIGIN:
~/rubytesting/TheRubyProgrammingLanguage/Chapter7ClassesAndModules$ ruby InheritanceAndConstants.rb 0 0 # linea 21 0 0 0 # 23 0 0 # 24 0 0 # 29La diferencia entre constantes y métodos es que las constantes se buscan en el ámbito léxico del lugar en el que son usadas antes de mirar en la jerarquía de herencia. Esto significa que si
Point3D hereda de
Point métodos que usan la constante ORIGIN, la conducta de dichos métodos no cambia
cuando Point3D define su propia constante ORIGIN.
Casiano Rodriguez León 2015-01-07