Herencia y Métodos de Clase

Si nuestra clase Point3D hereda de Point y Point define un método de clase sum entonces la llamada Point3D.sum invocará a Point.sum en el caso de que la clase Point3D no defina su propio método sum.

~/rubytesting/TheRubyProgrammingLanguage/Chapter7ClassesAndModules$ cat -n Point3DSuper.rb
     1  class Point
     2    attr_reader :x, :y   
     3  
     4    def initialize(x,y)
     5      @x,@y = x, y
     6    end
     7  
     8    def self.sum(* points)
     9      x, y  = 0, 0
    10      points.each { |p| x += p.x; y += p.y }
    11      Point.new(x, y)
    12    end
    13  
    14    def to_s
    15      "#@x #@y"
    16    end
    17  end
    18  
    19  class Point3D < Point
    20    attr_reader :z
    21  
    22    def initialize(x, y, z)
    23      super(x, y)
    24      @z = z
    25    end
    26  
    27    def self.sum(* points)
    28      p = super
    29      z = points.inject(0) { |a,r| a  += r.z } 
    30      Point3D.new(p.x, p.y, z)
    31    end
    32  
    33    def to_s
    34      super+" #@z"
    35    end
    36  end
    37  
    38  if __FILE__ == $0
    39    q, r, s = Point3D.new(1,1,1), Point3D.new(2,2,2), Point3D.new(3,3,3)
    40  
    41    puts Point3D.sum(q, r, s)
    42  end
Como se ve, podemos usar super con métodos de clase con el mismo significado que en los métodos de objeto.

La línea 28 es equivalente a p = super(* points) y también equivalente a p = Point.sum(* points)

~/rubytesting/TheRubyProgrammingLanguage/Chapter7ClassesAndModules$ ruby Point3DSuper.rb 
6 6 6

Casiano Rodriguez León 2015-06-18