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 endComo 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-01-07