2014-03-19 83 views
0

我想知道私人和受保護的Ruby之間的區別,有很多來源,但他們通常只告訴我私人方法不能被繼承,但以許多不同的方式。保護和私人之間的區別

class Person 
    private 

    def hello 
    puts "hello" 
    end 
end 

class Student < Person 

    def initialize 
    hello 
    end 
end 

leo = Student.new 

但是,這個非常簡單的例子證明了這種說法是錯誤的,私有方法被繼承和使用。此外,如果我在這裏將'private'更改爲'protected',它仍然會給我「hello」,同時創建leo變量。那麼公共和保護怎麼樣?

+0

好的,告訴我哪個 – Leo

+0

@Leo - http://www.amazon.co.uk/Ruby-Programming-Language-David-Flanagan/dp/0596516177/ref=sr_1_5?ie=UTF8&qid=1395244731&sr=8- 5&keywords = ruby​​ – BroiSatse

+0

@BroiSatse我已經添加了這本書的鏈接,如果你當然不介意的話:) –

回答

2

請看看這篇博客Ruby Access Control

從來源:

公共方法,每個人都可以叫 - 沒有訪問控制強制執行。一個類的實例方法(這些方法不僅僅屬於一個對象;相反,類的每個實例都可以調用它們)默認是公共的;任何人都可以致電他們初始化方法始終是私有的。

受保護方法只能由定義類及其子類的對象調用。訪問保存在家庭中。但是,受保護的使用是有限的。

Private方法不能用明確的接收方來調用 - 接收方總是自我的。這意味着私有方法只能在當前對象的上下文中調用;你不能調用另一個對象的私有方法。

另外,我建議你讀這本書The Ruby Programming Language

0

我發現在網上搜索第一件事:

http://blog.zerosum.org/2007/11/22/ruby-method-visibility

的最大區別其他語言似乎是私有方法可以調用按子類但只有沒有明確的接收者(即使它是self)。這裏的接收者的意思是以Smalltalk OO的方式,在對象上調用方法可以被看作是向對象發送消息。 當你在你的例子中只寫了「hello」時,它沒有明確的接收者,而隱式接收者是self,所以它可以工作,儘管它與其他一些OO語言的語義相矛盾。