婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 淺析Ruby中繼承和消息的相關知識

淺析Ruby中繼承和消息的相關知識

熱門標簽:電銷機器人廠商代理 徐州網絡外呼系統哪個好 白銀外呼paas系統 湖州u友防封電銷卡 常德電銷平臺外呼系統軟件價格 百度地圖標注自定義圖片 滴滴外呼系統 高德地圖標注客服 地圖標注賺錢項目注冊

繼承允許你創建一個類,作為另一個類的精煉(refinement)和特化(specialization)。例如,在我們的自動點唱機系統中,有“歌曲”這一概念,被封裝在Song類中,然后,隨著市場的成長,我們需要提供卡拉OK的支持。一首卡拉OK歌曲和其他歌曲沒什么兩樣(它只是沒有主唱的音軌,對此我們不必關心)。不過,它還包括對于的一套歌詞以及時間信息。當我們的自動點唱機在播放一首卡拉OK歌曲時,歌詞應該隨音樂滾動顯示在點唱機前的屏幕上。

解決這個問題的一種方法是定義一個新的類KaraokeSong,就是Song加上歌詞。

class KaraokeSong Song

  def initialize(name,artist,duration,lyrics)

    super(name,artist,duration)

    @lyrics = lyrics

  end

end

類定義一行中的“ Song”告訴Ruby, KaraokeSong是Song 的子類(subclass).因此,這也意味著Song是KaraokeSong的超類(superclass)

song = KaraokeSong.new("My Way","Sinatra",255,"And now,the ...")

song.to_s        ->          *Song:My Way--Sinatra(225)*

調用to_s方法沒有顯示歌詞

這和我們在向一個對象發送消息時,Ruby判定調用哪個方法的機制有關。在程序代碼的初始解析(parse)期間,當Ruby遇到方法調用song.to_s時,它并不知道從何處找到to_s方法,而是將判定推遲直至程序開始運行時再運行。在那時,Ruby查看song所屬的類。如果該類實現了和消息名稱相同的方法,就運行這個方法。否則,Ruby就查看其父類中的方法,然后是祖父類,凡此以往追溯整個祖先鏈。如果最終它在祖先類中沒有找到合適的方法,Ruby會產生一種特殊的行為,通常是導致引發一個錯誤。

讓我們通過實現KaraokeSong#to_s來解決這個問題,你有許多方法可以完成它。讓我們從最槽糕的方法開始,我們將to_s方法從Song類中拷貝出來并添加lyrics信息。

class KaraokeSong

 #...

 def to_s

   "KS: #@name--#@artist(#@duration){#@lyrics}"

  end

end

song = KaraokeSong.new("My Way", "Sinatra", 225,"And now,the...")

song.to_s     ->"KS: My Way--Sinatra(225){And now,the...}"

我們正確地顯示了實例變量@lyrics的值。但使用這種方法,子類需要直接訪問其祖先的實例變量。那么為什么這是實現to_s的一種糟糕方式呢?

答案與良好的編程風格有關(有時被稱為解耦)。直接戳進父類的內部結構,并且顯示地檢驗它的實例變量,會使得我們和父類的實現緊密地綁在一起。

我們通過讓每個類處理其自身實現細節的方法來解決這個問題。當調用KaraokeSong#to_s時,我們調用其父類的to_s方法來得到歌曲的細節。然后,將歌詞信息添加上去,并返回結果。這里使用的技巧是Ruby的關鍵字super。當你調用super而不使用參數時,Ruby向當前對象的父類發送一個消息,要求它調用子類中的同名方法。Ruby將我們原先調用方法時的參數傳遞給父類的方法。現在,我們可以實現改進后新的to_s方法。

class KaraokeSong Song

  #Format ourselves as a string by appending

  #our lyrics to our parent's to_s value.

  def to_s

    super+"{#@lyrics}"

  end

end

song = KaraokeSong.new("My Way", "Sinatra" ,225, "And now,the...")

song.to_s      ->"Song:My Way--Sinatra(225){And now,the...}"

我們明確地告訴Ruby,KaraokeSong是Song的子類,但是我們并沒有指定Song類本身的父類是什么。如果你在定義一個類時沒有指定其父類,Ruby默認以Object類作為其父類。這意味著所有類的始祖都是Object,并且Object的實例方法對Ruby的所有對象都可用。

您可能感興趣的文章:
  • Ruby類繼承、抽象類、類拓展混入、代理類實例
  • Ruby最簡單的消息服務器代碼

標簽:荊門 普洱 遼寧 公主嶺 梧州 張家界 永州 三沙

巨人網絡通訊聲明:本文標題《淺析Ruby中繼承和消息的相關知識》,本文關鍵詞  淺析,Ruby,中,繼承,和,消息,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺析Ruby中繼承和消息的相關知識》相關的同類信息!
  • 本頁收集關于淺析Ruby中繼承和消息的相關知識的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 南皮县| 福州市| 乃东县| 九寨沟县| 乌拉特中旗| 错那县| 故城县| 黄大仙区| 佳木斯市| 达尔| 城步| 厦门市| 城口县| 建水县| 安仁县| 大关县| 凤冈县| 泸水县| 政和县| 韩城市| 秭归县| 平安县| 慈利县| 清徐县| 丹江口市| 同德县| 蕲春县| 伊金霍洛旗| 林周县| 石嘴山市| 明溪县| 比如县| 车险| 进贤县| 蛟河市| 石阡县| 清镇市| 沙田区| 高台县| 泰兴市| 巫溪县|