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