A veces se necesita mas de una forma de inicializar las instancias
de una clase.
Una manera simple de hacerlo es dando valores por defecto a los
parámetros de initialize:
class Point
def initialize(x, y, z = nil)
@x,@y,@z = x,y,z
end
end
Pero a menudo no es suficiente con esto. Necesitamos factory methods o
métodos factoría
para crear los objetos de nuestra clase.
Supongamos que queremos crear objetos Point
bien en coordenadas cartesianas
bien en coordenadas polares:
~/rubytesting/TheRubyProgrammingLanguage/Chapter7ClassesAndModules$ cat -n CartAndPolar.rb
1 include Math
2 class Point
3 attr_accessor :x, :y
4
5 def initialize(x, y)
6 @x, @y = x,y
7 end
8
9 private_class_method :new
10
11 def Point.cartesian(x,y)
12 new(x,y)
13 end
14
15 def Point.polar(r,theta)
16 new(r*cos(theta), r*sin(theta))
17 end
18
19 def r
20 sqrt(@x*@x+@y*@y)
21 end
22
23 def theta
24 atan2(@y, @x)
25 end
26 end
27 if __FILE__ == $0
28 p = Point.polar(1, PI/4)
29 puts p.r, p.theta # 1.0 0.785398
30 q = Point.cartesian(1, 1) # 1 1
31 puts q.x, q.y
32 end
Al hacer new privado lo hacemos inaccesible a las clases cliente,
de manera que las clases usuario de Point deberán de usar uno de los dos métodos factoría proveídos para construir un objeto Point.
~/rubytesting/TheRubyProgrammingLanguage/Chapter7ClassesAndModules$ ruby CartAndPolar.rb 1.0 0.785398163397448 1 1
Casiano Rodriguez León 2015-01-07