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 endPero 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 endAl 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