28 ene. 2020

Las Clases y los Objetos creados por ellas PARTE 3

Para terminar, vamos a ver los tipos de alcances que pueden tener los métodos de una clase.

Pueden ser cuatro:
Público: lo será siempre que no se declare otra cosa e indica que son accesibles por cualquiera que llame al método de la clase, de cualquier objeto de la clase y él mismo (self).

class Persona
def initialize(edad)
@edad = edad
end

def edad
@edad
end

end

Pedro = Persona.new(25)
Juan = Persona.new(64)

puts Pedro.edad
puts Juan.edad

Esto nos da la salida esperada de 25 y 64 respectivamente

también se puede escribir así:

def adios           #este es de visibilidad pública
@adios
end
private :adios

Protegido: Los objetos no pueden acceder al método protegido, sólo son accesibles a los otros objetos de la misma clase o las subclases, es decir, los que heredan de la clase principal de la misma clase, pero nunca por el propio objeto.


class Persona

def initialize(edad)
@edad = edad
end

def edad                           # este es el método protegido, pero si lo declaramos aquí no funciona
@edad
end

def compararedad(op)                                        #op es otro objeto con el que se comparará
if op.edad > edad                                                #el objeto Juan si puedo consultar el dato de Pedro
'La edad de la otra persona es mayor'
else
'La edad de la otra persona es la misma o menos'
end

end
protected :edad                                                     #OJO aquí si funciona porque ya ha sido leído
end
Pedro = Persona.new(25)
Juan = Persona.new(64)


puts Pedro.compararedad(Juan)
puts Juan.edad

Esto dará la salida:
La edad de la otra persona es mayor
prueba1.rb:27:in `<main>': protected method `edad' called for #<Persona:0x02d94a28 @edad=64> (NoMethodError)

el error es porque ni Pedro ni Juan tienen acceso a su método edad


Privado: Sólo es accesible por el propio objeto, es decir por self, no se puede acceder al método mismo pero si a un método que llame a las variables que interese saber.

class Persona

def initialize(edad, altura)                       
@edad = edad
@altura = altura
end

def edad
@edad
end

def altura                               #este es un método público
@altura
end

def variables
#este método variables llama a las variables edad y altura
puts "Este es el valor de la variable edad = #{edad} y altura = #{altura}"

end
private :edad                                      # edad es el método privado
end
Pedro = Persona.new(33, 180)
Juan = Persona.new(64,258)

puts Pedro.variables
puts Juan.variables
puts Juan.altura
puts Juan.edad

Que da la salida:

Este es el valor de la variable edad = 33 y altura = 180

Este es el valor de la variable edad = 64 y altura = 258

258
prueba1.rb:28:in `<main>': private method `edad' called for #<Persona:0x02e745d0 @edad=64, @altura=258> (NoMethodError)


Si sustituirmos la última línea de código por:
Puts Juan.send :edad                                       #send es un método que permite acceder siempre
nos imprimirá el valor de ese método 64 que antes nos daba error.