Herencia y Constantes

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                 #       29
La 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