存取控制(封裝)

  • 隱藏某一方法的具體執行步驟,把過程和資料包起來,對資料的操作只能通過已定義的介面(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,還是可以執行。