iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
Software Development

Zero to Ruby on Rails系列 第 12

Day 12 - Object-Oriented Programming - part 3 物件導向程式設計(三)

  • 分享至 

  • xImage
  •  

存取控制

在 Ruby 中,存取控制主要依賴於存取修飾符,它們定義了物件的屬性和方法在不同情況下的可見性,可以說是有些功能不想讓外部直接使用,所以 Ruby 提供了三個主要的存取修飾符:publicprivateprotected

Public 公開

在默認的情況下,所有的方法都是公開的,可以從物件的外部存取,這表示你可以在任何地方調用這些方法,簡單來說沒特別說明的都是公開的方法

在下方的程式碼中,由於是公開的方法所以魯夫也會用三刀流奧義

class Swordsman 
  def three_swords 
    puts "三刀流奧義·三千世界"
  end 
end

luffy = Swordsman.new  
luffy.three_swords    # 可以使用 three_swords 方法

Private 私有

私有方法只能在類別內部取用,無法從物件的外部取用,通常用於不希望或是不必要讓外部去取用的方法,將它們隱藏放在私有方法裡面,所以下方的情況下,連索隆自己都無法使用三刀流three_swords

class Swordsman 
  private
  def three_swords 
    puts "三刀流奧義·三千世界"
  end 
end

zoro = Swordsman.new  
zoro.three_swords #取用失敗 印出undefined method `three_swords' for ...

private = 不能有明確的訊息接收者 (receiver) 也可以說是呼叫方法的時候不會有小數點,改成下方使用一個公開use_sword方法去呼叫私有three_swords方法,這樣一來索隆就可以正常使用三刀流這個私有方法拉three_swords

小知識: 在 Ruby 的存取控制跟別的程式語言不一樣 zoro 呼叫use_sword 方法比較像是給 zoro 這個物件送了一個 use_sword 的訊息

zoro.use_sword
zoro = 接收者
use_sword = 訊息

class Swordsman
  def use_sword
    three_swords
  end
  
  private 
  def three_swords
    puts "三刀流奧義·三千世界"
  end
end

zoro = Swordsman.new 
zoro.use_sword     # 成功印出 三刀流奧義·三千世界

Protected 受保護

受保護的方法可以在同一個類別內的其他方法中使用,也可以在子類別中使用,它們通常用於實現某些保護性的操作,簡單來說 protect = 不限定有沒有明確的訊息接收者

class Swordsman
  def use_sword
    self.three_swords
  end
  
  protected 
  def three_swords
    puts "三刀流奧義·三千世界"
  end
end

zoro = Swordsman.new 
zoro.use_sword     # 成功印出 三刀流奧義·三千世界

這樣即使前面有沒有小數點.索隆都可以用三刀流奧義

預告

Day 13 預計繼續介紹物件導向程式設計(四),我們明天見!


上一篇
Day 11 - Object-Oriented Programming - part 2 物件導向程式設計(二)
下一篇
Day 13 - Object-Oriented Programming - part 4 物件導向程式設計(四)
系列文
Zero to Ruby on Rails30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言