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 0Obsé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