Ruby繼承的語法安全
class DerivedClass < BaseClass #some stuff end
< 爲繼承符號ide
重寫(override) 的概念函數
有時, 咱們但願子類從父類繼承來的方法能夠作與父類不相同的事情,這就須要在子類中重寫方法。例如, 你有一個類名字叫Email繼承於類Message,兩個類都有send方法,可是Email類的send方法須要有郵件地址和一系列郵件協議,可是Message中的send方法並不知道這些,與其在Email類中添加send_mail方法,而從父類繼承的send方法棄之不用, 不如顯式的修改send方法以適應Email的需求。spa
例如:code
class Creature def initialize(name) @name = name end def fight return "Punch to the chops!" end end # Add your code below! class Dragon < Creature def fight return "Breathes fire!" end end dragon = Dragon.new("dragon") dragon.fight -------------------------------------------------- 輸出: "Breathes fire!"
另外一方面, 有時子類發現它所須要的繼承自父類的方法已經被改寫, 不要驚慌, 咱們能夠直接獲取父類的響應方法, 這須要使用super關鍵字。blog
語法爲:繼承
class DerivedClass < Base def some_method super(optional args) # Some stuff end end end
當你在方法中調用super, 這就是告訴Ruby,在父類中找到與調用super的這個方法同名的函數,若是找到, 那麼Ruby將會使用其父類版本的這個方法。接口
例如:it
class Creature def initialize(name) @name = name end def fight return "Punch to the chops!" end end # Add your code below! class Dragon < Creature def fight puts "Instead of breathing fire..." super end end dragon = Dragon.new("w") dragon.fight ------------------------------------------------------------------- 輸出: Instead of breathing fire... "Punch to the chops!"
Ruby不支持多繼承。然而Ruby容許使用mixin, 這個咱們稍後再講。io
爲了程序的安全性, Ruby容許咱們顯式地對方法進行public或private聲明, public方法容許做爲接口被調用,private方法則對外界不可見。若是不寫public或private,Ruby默認爲public。
1 class Person 2 def initialize(name, age) 3 @name = name 4 @age = age 5 end 6 7 public # This method can be called from outside the class. 8 9 def about_me 10 puts "I'm #{@name} and I'm #{@age} years old!" 11 end 12 13 private # This method can't! 14 15 def bank_account_number 16 @account_number = 12345 17 puts "My bank account number is #{@account_number}." 18 end 19 end 20 21 eric = Person.new("Eric", 26) 22 eric.about_me 23 eric.bank_account_number #錯誤, 調用了私有方法! ------------------------------------------------------------------------- 輸出: I'm Eric and I'm 26 years old! private method `bank_account_number' called for #<Context::Person:0x0000000262d930 @name="Eric", @age=26>
用attr_reader, attr_writer讀寫屬性(attribute)
根據前面咱們所學,若是想要訪問定義在類中的屬性,例如,咱們想要訪問@name實例變量, 咱們必須這麼寫
def name @name end
若是咱們想要咱們想修改@name實例變量,那麼咱們要這麼寫:
def name=(value) @name = value end
如今沒必要這麼麻煩了。咱們能夠用attr_reader和attr_writer來讀寫變量,以下:
class Person attr_reader :name attr_writer :name def initialize(name) @name = name end end
當遇到上面的代碼時,Ruby自動地作相似以下的事情:
def name @name end def name=(value) @name = value end
像變魔術同樣, 咱們能夠隨意讀寫變量了!咱們僅僅是把變量(轉換爲symbol)傳給attr_reader和attr_writer
若是你既想read也想write一個變量, 那麼還有比使用attr_reader和attr_writer更加簡短的辦法, 那就是用attr_accessor.