Ruby中的public、protected和private
栗子1:
class Person
? public
? def my_public_method
? ? 'I am a public method'
? end
? protected
? def my_protected_method
? ? 'I am a protected method'
? end
? private
? def my_private_method
? ? 'I am a private method'
? end
end
person1 = Person.new
嘗試:
? ? puts person1.my_public_method
? ? 輸出:I am a public method
? ? puts person1.my_protected_method
? ? 輸出:main.rb:617:in `': protected method `my_protected_method' called for # ? (NoMethodError)
? ? puts person1.my_private_method
? ? 輸出:main.rb:618:in `': private method `my_private_method' called for #(NoMethodError)
得出:public能被實(shí)例對(duì)象調(diào)用,protected和private不能被實(shí)例對(duì)象直接調(diào)用
栗子2:
class Person
? public
? def my_public_method
? ? 'I am a public method'
? end
? def access_method
? ? puts my_public_method
? ? puts my_protected_method
? ? puts my_private_method
? end
? protected
? def my_protected_method
? ? 'I am a protected method'
? end
? private
? def my_private_method
? ? 'I am a private method'
? end
end
person1 = Person.new
person1.access_method
輸出:
? ? I am a public method
? ? I am a protected method
? ? I am a private method
得出:public、protected、private方法都可以被定義他們的類訪問(wèn)
栗子3:
class Person
? public
? def my_public_method
? ? 'I am a public method'
? end
? protected
? def my_protected_method
? ? 'I am a protected method'
? end
? private
? def my_private_method
? ? 'I am a private method'
? end
end
class Man < Person
? def access_method
? ? puts my_public_method
? ? puts my_protected_method
? ? puts my_private_method
? end
end
son = Man.new
son.access_method
輸出:
? ? I am a public method
? ? I am a protected method
? ? I am a private method
得出:public、protected、private方法都可以被定義他們的類的子類訪問(wèn)
栗子4:
class Person
? public
? def call_method_protected(testmember)
? ? puts testmember.my_protected_method
? end
? def call_method_private(testmember)
? ? puts testmember.my_private_method
? end
? def my_public_method
? ? 'I am a public method'
? end
? protected
? def my_protected_method
? ? 'I am a protected method'
? end
? private
? def my_private_method
? ? 'I am a private method'
? end
end
person1 = Person.new
person2 = Person.new
嘗試:
? ? person2.call_method_protected(person1)
? ? 輸出:
? ? I am a protected method
? ? person2.call_method_private(person1)
? ? 輸出:
? ? main.rb:720:in `call_method_private': private method `my_private_method' called for #(NoMethodError)
得出:protected方法可以被其他的實(shí)例對(duì)象訪問(wèn),而private方法不可以。
總結(jié):
public方法可以被定義它的類和子類訪問(wèn),并可以被類和子類的實(shí)例對(duì)象調(diào)用;
protected方法可以被定義它的類和子類訪問(wèn),不能被類和子類的實(shí)例對(duì)象調(diào)用,但可以被該類的實(shí)例對(duì)象(所有)訪問(wèn);
private方法可以被定義它的類和子類訪問(wèn),不能被類和子類的實(shí)例對(duì)象調(diào)用,只能在自身中調(diào)用私有方法。