Techioz Blog

Ruby ではなぜ子クラスが親のプライベート メソッドにアクセスできるのでしょうか?

概要

class Main
    def say_hello
        puts "Hello"
    end
    
    private
        def say_hi
            puts "hi"
        end
end

class SubMain < Main
    def say_hello
        puts "Testing #{say_hi}"
    end

end

test = SubMain.new
test.say_hello()    

出力:

解決策

違いは、Ruby ではサブクラスのプライベート メソッドを暗黙的に呼び出すことができるが、明示的には呼び出すことができないことです。 protected は両方の方法で呼び出すことができます。なぜですか?マッツさんに聞いてみると良いと思います。

例:

class TestMain

  protected
  def say_hola
    puts "hola"
  end

  def say_ni_hao
    puts "ni hao"
  end

  private
  def say_hi
    puts "hi"
  end

  def say_bonjour
    puts "bonjour"
  end
end

class SubMain < TestMain
  def say_hellos
    # works - protected/implicit
    say_hola
    # works - protected/explicit
    self.say_ni_hao

    # works - private/implicit
    say_hi
    # fails - private/explicit
    self.say_bonjour
  end
end

test = SubMain.new
test.say_hellos()