Ruby類的繼承

來源:互聯網
上載者:User

標籤:style   blog   color   io   使用   ar   for   sp   div   

Ruby繼承的文法

class DerivedClass < BaseClass    #some stuffend

 < 為繼承符號

重寫(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!"  endend# Add your code below!class Dragon < Creature    def fight        return "Breathes fire!"    endend    dragon = Dragon.new("dragon")dragon.fight--------------------------------------------------輸出:"Breathes fire!"

 

另一方面, 有時子類發現它所需要的繼承自父類的方法已經被改寫, 不要驚慌, 我們可以直接擷取父類的回應程式法, 這需要使用super關鍵字。

文法為:

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

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

例如:

class Creature  def initialize(name)    @name = name  end    def fight    return "Punch to the chops!"  endend# Add your code below!class Dragon < Creature    def fight        puts "Instead of breathing fire..."        super    endend    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_me10     puts "I‘m #{@name} and I‘m #{@age} years old!"11   end12   13   private   # This method can‘t!14   15   def bank_account_number16     @account_number = 1234517     puts "My bank account number is #{@account_number}."18   end19 end20 21 eric = Person.new("Eric", 26)22 eric.about_me23 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  @nameend

如果我們想要我們想修改@name執行個體變數,那麼我們要這麼寫:

def name=(value)  @name = valueend

現在不必這麼麻煩了。我們可以用attr_reader和attr_writer來讀寫變數,如下:

class Person  attr_reader :name  attr_writer :name  def initialize(name)    @name = name  endend

當遇到上面的代碼時,Ruby自動地做類似如下的事情:

def name  @nameenddef name=(value)  @name = valueend

像變魔術一樣, 我們可以隨意讀寫變數了!我們僅僅是把變數(轉換為symbol)傳給attr_reader和attr_writer

如果你既想read也想write一個變數, 那麼還有比使用attr_reader和attr_writer更加簡短的辦法, 那就是用attr_accessor.

 

Ruby類的繼承

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.