Ruby類的繼承


Ruby繼承的語法

class DerivedClass < BaseClass
    #some stuff
end

 < 為繼承符號

重寫(override) 的概念

有時, 我們希望子類從父類繼承來的方法可以做與父類不相同的事情,這就需要在子類中重寫方法。例如, 你有一個類名字叫Email繼承於類Message,兩個類都有send方法,但是Email類的send方法需要有郵件地址和一系列郵件協議,但是Message中的send方法並不知道這些,與其在Email類中添加send_mail方法,而從父類繼承的send方法棄之不用, 不如顯式的修改send方法以適應Email的需求。

例如:

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關鍵字。

語法為:

class DerivedClass < Base
  def some_method
    super(optional args)
      # Some stuff
    end
  end
end

當你在方法中調用super, 這就是告訴Ruby,在父類中找到與調用super的這個方法同名的函數,如果找到, 那么Ruby將會使用其父類版本的這個方法。

例如:

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, 這個我們稍后再講。

 

為了程序的安全性, 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.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM