存取控制(封裝)
- 隱藏某一方法的具體執行步驟,把過程和資料包起來,對資料的操作只能通過已定義的介面(interface),封裝的目的,是讓其他人可以使用物件,但不需要知道物件的內部邏輯。
public
- 就是所有的人都可以直接存取(除了initialize方法,永遠都是private的,並且只會被new呼叫)
private
- 是只有在類別內部才可以存取
- private的變化 ```ruby= class Dog private def eat puts “food” end end
lucky = Dog.new lucky.send(:eat)
=> food
> private的定義為: 被呼叫的方法前面不能有接收者,所以將在這裡的eat前面加了send(為公開方法)後,並將eat轉為符號:eat即可順利執行。
### protected
- 差不多是在前兩者之間,比 private 寬鬆一些,但又沒有 public 那麼自在,protected 在同一個類別內或是同一個 package,或是繼承它的子類別可以自由取用,但如果不是的話則不可存取(較少使用)。
## 這三個在Ruby語言裡並不是關鍵字,只是一般的方法
```ruby=
class Cat
def eat
drink
self.sleep
puts "nice"
end
private
def drink
puts "water"
end
protected
def sleep
puts "bed"
end
end
kitty = Cat.new
kitty.eat
=> water
=> bed
=> nice
1.分別建立了三個存取控制的方法: eat,sleeping,gossip
2.在這裡的eat方法沒有特別限制,所以為public(要加上也可以,只是通常不會這麼做)。
3.建立實體kitty後,只有在public裡的eat方法可正常執行。
4.在Ruby語言裡,kitty.drink意思為:對著kitty實體(接收者),發送drink方法(訊息),而private的原則為:不能有明確的”訊息接收者”。
簡易來說: private呼叫方法時不會有
.
而這裡的drink方法被呼叫時前面有了”kitty”接收者,故無法順利執行,只要將drink方法放到public裡,即可正常執行。5.同理protected內的sleep方法也必須要在public裡才可執行,但不同的是,即使前面有”接收者”如
:self
,還是可以執行。