訪問控制

Java 與 Ruby 的訪問控制的比較: 如果在 Java 中將方法宣告為 private,則只能通過同一類中的其他方法訪問它。如果一個方法被宣告為 protected,則可以由同一個包中存在的其他類以及該類在不同包中的子類訪問。當一個方法公開時,每個人都可以看到它。在 Java 中,訪問控制可見性概念取決於這些類在繼承/包層次結構中的位置。

而在 Ruby 中,繼承層次結構或包/模組不適合。關鍵在於哪個物件是方法的接收者

**對於 Ruby 中的私有方法,**永遠不能使用顯式接收器呼叫它。我們可以(僅)使用隱式接收器呼叫私有方法。

這也意味著我們可以從宣告的類中呼叫私有方法以及此類的所有子類。

class Test1
  def main_method
    method_private
  end

  private
  def method_private
    puts "Inside methodPrivate for #{self.class}"
  end
end

class Test2 < Test1
  def main_method
    method_private
  end
end

Test1.new.main_method
Test2.new.main_method

Inside methodPrivate for Test1
Inside methodPrivate for Test2

class Test3 < Test1
  def main_method
    self.method_private #We were trying to call a private method with an explicit receiver and if called in the same class with self would fail.
  end
end

Test1.new.main_method
This will throw NoMethodError

You can never call the private method from outside the class hierarchy where it was defined.

**** 可以使用隱式接收器呼叫受保護的方法,就像私有一樣。另外,如果接收器是自身同一類的物件,則受保護的方法也可以由顯式接收器(僅)呼叫。

class Test1
  def main_method
    method_protected
  end

  protected
  def method_protected
    puts "InSide method_protected for #{self.class}"
  end
end

class Test2 < Test1
  def main_method
    method_protected # called by implicit receiver
  end
end

class Test3 < Test1
  def main_method
    self.method_protected # called by explicit receiver "an object of the same class"
  end
end

InSide method_protected for Test1
InSide method_protected for Test2
InSide method_protected for Test3

class Test4 < Test1
  def main_method
    Test2.new.method_protected # "Test2.new is the same type of object as self"
  end
end

Test4.new.main_method

class Test5
  def main_method
    Test2.new.method_protected
  end
end

Test5.new.main_method
This would fail as object Test5 is not subclass of Test1

考慮具有最大可見性的 Public 方法

摘要

  1. 公共: 公共方法具有最大可見性

  2. 受保護: 可以使用隱式接收器呼叫受保護的方法,就像私有一樣。另外,如果接收器是自身同一類的物件,則受保護的方法也可以由顯式接收器(僅)呼叫。

  3. Private: **對於 Ruby 中的私有方法,**永遠不能使用顯式接收器呼叫它。我們可以(僅)使用隱式接收器呼叫私有方法。這也意味著我們可以從宣告的類中呼叫私有方法以及此類的所有子類。