在之前我們說(shuō)過(guò)一個(gè)原則,我們盡量通過(guò)訪(fǎng)問(wèn)methods來(lái)實(shí)現對states的改變,而不是直接控制variables。ruby的設計者希望我們這么做。ruby認為,methods是控制states的,所以只要控制了methods的訪(fǎng)問(wèn)權限,就可以達到目的了
在描述訪(fǎng)問(wèn)控制的時(shí)候,我務(wù)必要強調一點(diǎn)的就是:ruby里面的訪(fǎng)問(wèn)控制(Access Control),主要描述的是一個(gè)receivers和messages的問(wèn)題,而非java,c++里面的訪(fǎng)問(wèn)控制,因為ruby是一種動(dòng)態(tài)語(yǔ)言,語(yǔ)言的本質(zhì)決定了訪(fǎng)問(wèn)控制必須是動(dòng)態(tài)的,下面說(shuō)一下class definitions時(shí)候的問(wèn)題,例如:
class Ex
protected
def method_protected
"proected"
end
private
def method_private
"private"
end
public
def method_public
"public"
end
def access_control
puts method_protected
puts method_private
puts method_public
end
end
class Ex2 < Ex
def test2_public
puts method_public
end
def test2_private
puts method_private
end
def test2_protected
puts method_protected
end
end
ex1 = Ex.new
ex1.access_control
ex2 = Ex2.new
ex2.test2_private
ex2.test2_protected
ex2.test2_public
結果:
proected
private
public
private
proected
public
我們可以看見(jiàn),在class definitions的時(shí)候,所有的methods,都是可見(jiàn)的,不論是在類(lèi)還是子類(lèi)
訪(fǎng)問(wèn)控制,實(shí)際上只控制receivers對methods的調用,這時(shí)候我們討論的是作為一個(gè)message的角色的時(shí)候:
1)private:不可以作為任何 object 的message
2)protected:在一個(gè)類(lèi)的子類(lèi)的definition時(shí),可以作為一個(gè)message,被調用
3)public:任何時(shí)候都可以作為一個(gè)message,無(wú)論是在class definition時(shí),還是external
舉例說(shuō)明:
class Ex
private
def method
"here"
end
end
class Ex2 < Ex
def method2(ex)
ex.method
end
end
ex2 = Ex2.new
puts ex2.method2(Ex.new)
結果:
in `method2‘: private method `method‘ called for #<Ex:0x298edb0> (NoMethodError)
改成protected
class Ex
protected
def method
"here"
end
end
class Ex2 < Ex
def method2(ex)
ex.method
end
end
ex2 = Ex2.new
puts ex2.method2(Ex.new)
結果:
here
由此我們可以看見(jiàn)private是不能做message的,再看看protected和public
class Ex
public
def method
"here"
end
end
puts Ex.new.method
結果:
here
改成protected:
class Ex
protected
def method
"here"
end
end
puts Ex.new.method
結果:
protected method `method‘ called for #<Ex:0x298f1e8> (NoMethodError)
這里使用外部的一個(gè)receiver來(lái)調用message,所以protected method無(wú)法使用
*關(guān)于receiver,message請參考《ruby系列教材(1):Ruby Is an Object-Oriented Language》
聯(lián)系客服