今更聞けない private と protected の違い

を調べてみる

privateの意味は、メソッドを関数形式でだけ呼び出せるようにし、レシーバー形式では呼び出せないようにするという意味です。したがって、可視性がprivateなメソッドは、自クラス及びサブクラスからしか参照できません。

protectedも同様に、自クラス及びサブクラスからしか参照できませんが、関数形式でもレシーバー形式でも呼び出せます。

メソッドのカプセル化に必要な機能です。

privateとprotectedの違いが分かりません

Java 脳からするとかなり違和感を感じる。Ruby では private メソッドも継承したクラスから使えちゃう。

class Hello
  private
  def hello
    puts "hello world"
  end
end

class Hello2 < Hello
  def say
    hello
  end
end

Hello2.new.say
#=> hello world

private は外から呼べないメソッド

class Hello
  private
  def hello
    puts "hello world"
  end
end
Hello.new.hello 
#=> private method `hello' called for #<Hello:0x100317a8> (NoMethodError)

でも、protected は外からも呼べるメソッド。ただし、自クラス及びサブクラスからのみ。

class Hello
  protected
  def hello
    puts "hello world"
  end
end

class Hello2 < Hello
  def say
    Hello.new.hello
  end
end

Hello2.new.say
#=> hello world

ただし、使い処がわからない・・・。