Ruby | Control de acceso

El control de acceso es una parte muy importante del lenguaje de programación orientado a objetos que se utiliza para restringir la visibilidad de los métodos y campos de miembros para proteger los datos de la modificación accidental. En términos de control de acceso, Ruby es diferente de todos los demás lenguajes de programación orientados a objetos.

Puntos importantes sobre el control de acceso de Ruby:

  • La visibilidad de la variable de clase y la instancia siempre es privada.
  • Los controles de acceso solo son aplicables a los métodos.
  • No podemos aplicar ningún control de acceso a la instancia y las variables de clase.
  • Los métodos privados en Ruby también se pueden heredar al igual que los métodos públicos y protegidos.

En Ruby, el control de acceso funciona con dos condiciones:

  • Primero, desde donde se llama al método, es decir, dentro o fuera de la definición de la clase.
  • En segundo lugar, la palabra clave propia está incluida o no. Básicamente, la palabra clave propia se utiliza para señalar al destinatario actual.

En Ruby, no es necesario que la herencia se involucre en el control de acceso, como en C++, el control de acceso se usa en la herencia. El control de acceso es de tres tipos, como se muestra en la siguiente imagen:

Método público

Los métodos públicos son aquellos métodos que cualquiera puede llamar. Como sabemos, el control de acceso solo funciona en los métodos, por lo que, de forma predeterminada, todos los métodos son públicos . Pero aun así, podemos definir un método público explícitamente usando la palabra clave pública . Los métodos públicos generalmente se llaman fuera de la clase.

Ejemplo:

# Ruby program to demonstrate 
# the public access control
  
#!/usr/bin/ruby
  
# taking a class
class GeeksforGeeks
  
     # public method without using 
     # public keyword    
     def geeks_1
         puts "public method geeks_1 is called"
     end
  
    # using public keyword
    public
     
     def geeks_2
         puts "public method geeks_2 is called"  
     end
       
     def geeks_3
           
         puts "public method geeks_3 is called"
           
         # calling geeks_1 method
         geeks_1
           
         # calling geeks_1 method using
         # self-keyword
         self.geeks_1
     end          
end
  
# creating the object of 
# class GeeksforGeeks
obj = GeeksforGeeks.new
  
# calling method geeks_1
obj.geeks_1
  
# calling method geeks_2
obj.geeks_2
  
# calling method geeks3
obj.geeks_3

Producción:

public method geeks_1 is called
public method geeks_2 is called
public method geeks_3 is called
public method geeks_1 is called
public method geeks_1 is called

Método privado

Los métodos privados son aquellos métodos a los que no se puede acceder fuera de la clase o, en otras palabras, los métodos privados se llaman solo dentro de la definición de la clase. Los métodos de la clase pueden acceder a miembros privados. En los métodos privados, no usamos la palabra clave self. De forma predeterminada, el método de inicialización será un método privado. El usuario no puede hacer que el método de inicialización sea el método público. Un método privado se define mediante el uso de una palabra clave privada .

Nota: Como sabemos que los métodos privados están estrictamente restringidos por su visibilidad, solo los miembros de la clase definida pueden acceder a estos métodos, pero la subclase puede heredarlos. Una subclase puede acceder a ellos y anularlos.

Ejemplo:

# Ruby program to demonstrate 
# the private access control
  
#!/usr/bin/ruby
  
# creating class
class GeeksforGeeks
       
    # using initialize method
    # it can't be private
    def initialize
        puts "This is the initialize Method"
     end
      
    # public method
    def geeks_1
          
             puts "Public geeks_1 Method"
         end
      
    # using the private keyword to 
    # declare a private method
    private
      
     def geeks_2
           
         puts "This is Private Method"  
     end 
       
end          
  
# creating the object of 
# the class GeeksforGeeks
obj = GeeksforGeeks.new
  
# calling method geeks_1
# (geeks1 method is public method)
obj.geeks_1
  
# calling private method will give the error
obj.geeks_2

Error:

archivo_fuente.rb:41:in `

‘: método privado `geeks_2’ llamado para #(NoMethodError)
¿Quiso decir? frikis_1

Este es el método de inicialización
Public geeks_1 Method

Método protegido

Los métodos protegidos solo pueden ser llamados por objetos de la clase definida y su subclase. El acceso de estos métodos está limitado entre la clase definida o su subclase. No puede acceder a métodos protegidos fuera de la clase definida o su subclase. El uso de métodos protegidos es finito. Los métodos protegidos se definen mediante la palabra clave protected .

Ejemplo:

# Ruby program to demonstrate 
# the protected access control
  
#!/usr/bin/ruby
  
class GeeksforGeeks
    
    # using initialize method
    def initialize
          
        # calling geeks_2 method
        geeks_2
          
        # calling geeks_2 method 
        # using self-keyword
        self.geeks_2
          
     end
      
    # public method
    def geeks_1
         puts " geeks_1 method is called"  
     end 
      
    # defining the protected method using
    # protected keyword
    protected
      
    def geeks_2
         puts " geeks_2 method is called"  
    end
  
end
  
# creating the object of class GeeksforGeeks
obj = GeeksforGeeks.new
  
# calling method
obj.geeks_1
  
  
# if you will try to call protected method 
# using the object of class then it will 
# give error
obj.geeks_2

Error:

archivo_fuente.rb:45:in `

‘: método protegido `geeks_2’ llamado para #(NoMethodError)
¿Quiso decir? frikis_1

el método geeks_2 se llama
el método geeks_2 se llama
el método geeks_1 se llama

Nota:

  • El usuario puede llamar a los métodos privados y protegidos dentro de un método público de la misma clase.

    Ejemplo:

    # Ruby program to demonstrate the calling 
    # of private and protected method in the 
    # public method
      
    class Geeks
       
        # public method
        def method_1
        
         p "Public Method of class Geeks"
           
            # calling protected and private method
            # inside the public method
            method_2
            method_3
        end
       
        # defining the protected method
        protected
       
        def method_2
              
            p "Protected Method of class Geeks"
         end
       
        # defining the private method   
        private
       
        def method_3
              
           p "Private Method of class Geeks"
              
         end
    end
       
    # creating an object of class Geeks
    obj = Geeks.new
      
    # calling the public method of class Geeks
    obj.method_1

    Producción:

    "Public Method of class Geeks"
    "Protected Method of class Geeks"
    "Private Method of class Geeks"
    
  • En general, los métodos privados no se pueden heredar en los lenguajes de programación orientados a objetos. Pero en Ruby, los métodos privados también se pueden heredar al igual que los métodos públicos y protegidos.

    Ejemplo:

    # Ruby program to demonstrate that private  
    # method can also be inherited
      
    class Geeks
       
        # public method
        def method_1
        
            p "Public Method of class Geeks"
         
        end
       
        # defining the protected method
        protected
       
        def method_2
              
            p "Protected Method of class Geeks"
         end
       
        # defining the private method   
        private
       
        def method_3
              
            p "Private Method of class Geeks"
              
         end
    end
      
    # Sudo class inheriting Geeks class
    class Sudo < Geeks
         
        # public method of Sudo class
        def method_4
              
            p "Public Method of Sudo Class"
              
            # calling all three methods 
            # of Geeks class
            method_1
            method_2
            method_3
        end
    end
       
    # creating an object of class Sudo
    obj_sudo = Sudo.new
      
    # calling the public method
    # of class Sudo which will
    # automatically call the private 
    # and protected method of Geeks class
    obj_sudo.method_4

    Producción:

    "Public Method of Sudo Class"
    "Public Method of class Geeks"
    "Protected Method of class Geeks"
    "Private Method of class Geeks"
    
  • Se puede acceder al método público fuera de la clase en la que están definidos. Pero el usuario no puede acceder a los métodos privados y protegidos fuera de la clase en la que fueron definidos.

    Ejemplo:

    # Ruby program to demonstrate that private  
    # and protected method can't be accessed 
    # outside the class even after inheritance
      
    class Geeks
       
        # public method
        def method_1
        
            p "Public Method of class Geeks"
         
        end
       
        # defining the protected method
        protected
       
        def method_2
              
            p "Protected Method of class Geeks"
         end
       
        # defining the private method   
        private
       
        def method_3
              
            p "Private Method of class Geeks"
              
         end
    end
      
    # Sudo class inheriting Geeks class
    class Sudo < Geeks
         
        # public method of Sudo class
        def method_4
              
            p "Public Method of Sudo Class"
              
        end
    end
       
    # creating an object of class Sudo
    obj_sudo = Sudo.new
      
    # calling the public method
    # of class Sudo and Geeks
    obj_sudo.method_4
    obj_sudo.method_1
      
    # if you will try to call the protected
    # and private method using the object 
    # of class Sudo, then it will give error
    obj_sudo.method_2
    obj_sudo.method_3

    Error:

    archivo_fuente.rb:54:in `

    ‘: método protegido `method_2’ llamado para #(NoMethodError)
    ¿Quiso decir? método
    método_1
    método_4
    métodos

    “Método público de la clase Sudo”
    “Método público de la clase Geeks”

  • La principal diferencia entre los métodos protegidos y privados es que se puede acceder a los métodos protegidos desde dentro de la clase mediante el uso de un receptor explícito, mientras que los métodos privados no.

    Ejemplo:

    # Ruby program to demonstrate that private  
    # and protected method can't be accessed 
    # outside the class even after inheritance
      
    class Geeks
       
        # public method
        def method_1
        
            p "Public Method of class Geeks"
         
        end
       
        # defining the protected method
        protected
       
        def method_2
              
            p "Protected Method of class Geeks"
         end
       
        # defining the private method   
        private
       
        def method_3
              
            p "Private Method of class Geeks"
              
         end
    end
      
    # Sudo class inheriting Geeks class
    class Sudo < Geeks
         
        # public method of Sudo class
        def method_4
              
            p "Public Method of Sudo Class"
              
          
          
            # calling the public method 
            # of Geeks class
            method_1
      
            # creating object of class Sudo
            # inside the public method of 
            # class Sudo
            obj_inside_sudo = Sudo.new
      
            # calling the protected  
            # method of class Geeks
            obj_inside_sudo.method_2
              
            # calling the private  
            # method of class Geeks
            # using an explicit receiver
            obj_inside_sudo.method_3 rescue p "You can't Access!" 
           
      
              
        end
    end
       
      
      
    # creating an object of class Sudo
    obj_sudo = Sudo.new
      
    # calling the public method
    # of class Sudo 
    obj_sudo.method_4

    Producción:

    "Public Method of Sudo Class"
    "Public Method of class Geeks"
    "Protected Method of class Geeks"
    "You can't Access!"
    
  • Para definir múltiples métodos protegidos y privados en una sola clase, puede usar la siguiente sintaxis:
    class class_name
    
      # this method is public 
      def public_method        
      end  
    
      public :method_1
      
      protected :method_2, :method_3
      
      private :method_4, :method_5  
    
    end  
    

Publicación traducida automáticamente

Artículo escrito por ankita_saini y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *