Ejemplo de Visibilidad de Métodos Protegidos

~/rubytesting/TheRubyProgrammingLanguage/Chapter7ClassesAndModules$ cat -n SubClass.rb 
     1  class Point
     2  
     3    def chuchu
     4      "Point: chuchu"
     5    end
     6  
     7    def chachi
     8      "Point: chachi"
     9    end
    10  
    11    private   :chuchu
    12    protected :chachi
    13  end
    14  
    15  class SubClass < Point
    16  
    17    def titi1 
    18      chuchu
    19    end
    20  
    21    def titi2 
    22      self.chuchu
    23    end
    24  
    25    def titi3
    26      chachi 
    27    end
    28  
    29    def titi4
    30      self.chachi 
    31    end
    32  end
    33  
    34  if __FILE__ == $0
    35    x = SubClass.new
    36    puts x.titi1
    37    begin
    38      puts x.titi2
    39      rescue 
    40        puts "Can't call private meth. via 'self'. Exception type: <#{$!.class}> message: <#{$!}>"
    41    end
    42  
    43    puts x.titi3
    44  
    45    puts x.titi4
    46  
    47    begin
    48      puts x.chachi
    49      rescue
    50        puts "Can't call protected meth. from outside. Exception type: <#{$!.class}> message: <#{$!}>"
    51    end
    52  end

La ejecución del programa produce la salida:

~/rubytesting/TheRubyProgrammingLanguage/Chapter7ClassesAndModules$ ruby SubClass.rb 
Point: chuchu
Can't call private meth. via 'self'. Exception type: <NoMethodError> message: <private method `chuchu' called for #<SubClass:0x1001685b8>>
Point: chachi
Point: chachi
Can't call protected meth. from outside. Exception type: <NoMethodError> message: <protected method `chachi' called for #<SubClass:0x1001685b8>>

The rule about when a protected method can be invoked can be described as follows:

A protected method defined by a class V (Visbility) may be invoked on an object c by a method in an object m (main en el ejemplo) if and only if the classes of c and m are both subclasses of the class V.

Casiano Rodriguez León 2015-06-18