一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Ruby - 淺析Ruby中繼承和消息的相關(guān)知識(shí)

淺析Ruby中繼承和消息的相關(guān)知識(shí)

2020-05-03 12:18腳本之家 Ruby

這篇文章主要介紹了Ruby中繼承和消息,是Ruby入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下

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

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

?
1
2
3
4
5
6
7
8
9
10
11
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)

?
1
2
3
song = KaraokeSong.new("My Way","Sinatra",255,"And now,the ...")
 
song.to_s        ->          *Song:My Way--Sinatra(225)*

調(diào)用to_s方法沒有顯示歌詞

這和我們?cè)谙蛞粋€(gè)對(duì)象發(fā)送消息時(shí),Ruby判定調(diào)用哪個(gè)方法的機(jī)制有關(guān)。在程序代碼的初始解析(parse)期間,當(dāng)Ruby遇到方法調(diào)用song.to_s時(shí),它并不知道從何處找到to_s方法,而是將判定推遲直至程序開始運(yùn)行時(shí)再運(yùn)行。在那時(shí),Ruby查看song所屬的類。如果該類實(shí)現(xiàn)了和消息名稱相同的方法,就運(yùn)行這個(gè)方法。否則,Ruby就查看其父類中的方法,然后是祖父類,凡此以往追溯整個(gè)祖先鏈。如果最終它在祖先類中沒有找到合適的方法,Ruby會(huì)產(chǎn)生一種特殊的行為,通常是導(dǎo)致引發(fā)一個(gè)錯(cuò)誤。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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...}"

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

答案與良好的編程風(fēng)格有關(guān)(有時(shí)被稱為解耦)。直接戳進(jìn)父類的內(nèi)部結(jié)構(gòu),并且顯示地檢驗(yàn)它的實(shí)例變量,會(huì)使得我們和父類的實(shí)現(xiàn)緊密地綁在一起。

我們通過讓每個(gè)類處理其自身實(shí)現(xiàn)細(xì)節(jié)的方法來解決這個(gè)問題。當(dāng)調(diào)用KaraokeSong#to_s時(shí),我們調(diào)用其父類的to_s方法來得到歌曲的細(xì)節(jié)。然后,將歌詞信息添加上去,并返回結(jié)果。這里使用的技巧是Ruby的關(guān)鍵字super。當(dāng)你調(diào)用super而不使用參數(shù)時(shí),Ruby向當(dāng)前對(duì)象的父類發(fā)送一個(gè)消息,要求它調(diào)用子類中的同名方法。Ruby將我們?cè)日{(diào)用方法時(shí)的參數(shù)傳遞給父類的方法?,F(xiàn)在,我們可以實(shí)現(xiàn)改進(jìn)后新的to_s方法。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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類本身的父類是什么。如果你在定義一個(gè)類時(shí)沒有指定其父類,Ruby默認(rèn)以O(shè)bject類作為其父類。這意味著所有類的始祖都是Object,并且Object的實(shí)例方法對(duì)Ruby的所有對(duì)象都可用。

延伸 · 閱讀

精彩推薦
  • RubyRuby環(huán)境下安裝使用bundler來管理多版本的gem

    Ruby環(huán)境下安裝使用bundler來管理多版本的gem

    這篇文章主要介紹了Ruby環(huán)境下安裝使用bundler來管理多版本的gem的方法,舉了Ruby On Rails中的應(yīng)用實(shí)例來進(jìn)行演示,需要的朋友可以參考下 ...

    日拱一卒4332020-05-10
  • RubyRuby迭代器的7種技巧分享

    Ruby迭代器的7種技巧分享

    這篇文章主要介紹了Ruby迭代器的7種技巧分享,Ruby中的迭代器非常人性化,本文既是講解了7個(gè)技巧也是講解了7種迭代器,需要的朋友可以參考下 ...

    腳本之家4782020-04-20
  • RubyRuby簡潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對(duì)象

    Ruby簡潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對(duì)象

    這篇文章主要介紹了Ruby簡潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對(duì)象,本文是學(xué)習(xí)筆記第一篇,需要的朋友可以參考下 ...

    腳本之家2472020-04-20
  • Ruby剖析 Ruby 訪問控制

    剖析 Ruby 訪問控制

    前面,我們說 Ruby 沒有函數(shù),只有方法.而且實(shí)際上有不止一種方法.這一節(jié)我們介紹 訪問控制 (accesscontrols). 想想當(dāng)我們?cè)谧罡邔佣皇窃谝粋€(gè)類的定義里定義...

    ruby教程網(wǎng)3572020-04-08
  • Ruby簡要說明Ruby中的迭代器

    簡要說明Ruby中的迭代器

    這篇文章主要介紹了Ruby中的迭代器,迭代器的概念在動(dòng)態(tài)語言的編程中十分重要,文章中介紹了Ruby中的each迭代器和collect迭代器,需要的朋友可以參考下 ...

    goldensun2772020-04-25
  • RubyCentOS中配置Ruby on Rails環(huán)境

    CentOS中配置Ruby on Rails環(huán)境

    經(jīng)過一個(gè)上午的折騰,終于把ROR環(huán)境在CentOS中搞定,繞了很多彎路,把文章寫下來總結(jié)一下 ...

    可樂加糖4762020-04-12
  • RubyRuby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例

    Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例

    這篇文章主要介紹了Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例,建造者模式將一個(gè)復(fù)雜對(duì)象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過程可以創(chuàng)建不同的表...

    范孝鵬2192020-05-07
  • RubyRuby進(jìn)行文件信息輸出實(shí)例代碼

    Ruby進(jìn)行文件信息輸出實(shí)例代碼

    Ruby進(jìn)行文件信息輸出實(shí)例代碼,數(shù)據(jù)是隨機(jī)的,所以每次的記錄都會(huì)不同。 ...

    ruby教程網(wǎng)2962020-04-10
主站蜘蛛池模板: jiizz亚洲护士厕所 | 99美国热| 女主被当众调教虐np | 日本免费一区二区三区四区五六区 | 欧美vpswindowssex 欧美va在线高清 | 国产亚洲精品福利在线 | 久久精品国产清白在天天线 | 99热com| 236z最新伦理| 国产精品热久久毛片 | 国产精品美女福利视频免费专区 | 欧美日韩国产亚洲一区二区三区 | 黑人巨大精品战中国美女 | 日韩免费毛片视频杨思敏 | 牛牛在线观看 | 日本艳鉧动漫1~6完整版在 | hd性欧美俱乐部中文 | 精品精品国产yyy5857香蕉 | 亚洲国产精品一区二区首页 | 欧美透逼视频 | 亚洲国产精品综合久久一线 | 乳环贵妇堕落开发调教番号 | 99视频全部免费 | 2020最新版的ab片 | 欧美精品久久久亚洲 | 嗯啊在线观看免费影院 | 亚洲尿尿| 波多野结衣黑人系列在线观看 | 無码一区中文字幕少妇熟女H | 午夜在线观看视频 | 成年人黄视频在线观看 | 国产一卡二卡3卡4卡更新 | 国产精品天天看天天爽 | 欧美一级免费看 | 欧美午夜寂寞影院安卓列表 | 日本精品一卡二卡≡卡四卡 | 国产一区二区三区福利 | 免费免费啪视频在线观播放 | 99热这里有免费国产精品 | 天美蜜桃精东乌鸦传媒 | 精品国产免费观看一区高清 |