訪問控制
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 方法
摘要
-
公共: 公共方法具有最大可見性
-
受保護: 可以使用隱式接收器呼叫受保護的方法,就像私有一樣。另外,如果接收器是自身或同一類的物件,則受保護的方法也可以由顯式接收器(僅)呼叫。
-
Private: **對於 Ruby 中的私有方法,**永遠不能使用顯式接收器呼叫它。我們可以(僅)使用隱式接收器呼叫私有方法。這也意味著我們可以從宣告的類中呼叫私有方法以及此類的所有子類。