Perl 6 - roles 沖突

學(xué)會了怎么創(chuàng)建類, 我們繼續(xù)用它來構(gòu)建我們的中心內(nèi)容:


class Hammer {
    method hammer($stuff) {
        say "You hammer on $stuff. BAM BAM BAM!";
    }
}

class Gavel {
    method hammer($stuff) {
        say "You hammer on $stuff. BAM BAM BAM!";
    }
}

class Mallet {
    method hammer($stuff) {
        say "You hammer on $stuff. BAM BAM BAM!";
    }
}

但是注意到了嗎? 這三個方法包含了同樣的方法, 在類中重復(fù)了。我們必須那樣做如果我們想讓每個 HammarGavelMallet 有能力擊打的話。(并且那是合理的)割笙。 但是遺憾的是我們不得不把那個方法一式三份。

為什么遺憾眯亦? 因?yàn)橐环矫嬖谡鎸?shí)世界中, 方法并不是很彼此相似, 有一天你決定在 hammer 方法中更改某些東西, 并沒有意識到這個方法在三個不同的地方... 這導(dǎo)致了一堆痛苦和難受伤溉。

所以我們的新玩具, 類, 展現(xiàn)出了一個問題。我們想在每個類中重用 hammer 方法妻率。一個新的概念, role 來拯救我們來了:


role Hammering {
    method hammer($stuff) {
        say "You hammer on $stuff. BAM BAM BAM!";
    }
}

雖然類經(jīng)常以一個合適的名詞命名, 但是 roles 經(jīng)常以一個分詞命名, 例如 Hammering乱顾。這不是一個必須遵守的規(guī)則, 但是它是一個好的經(jīng)驗(yàn)法則。現(xiàn)在類的定義變的簡單了:


class Hammer does Hammering { }
class Gavel  does Hammering { }
class Mallet does Hammering { }

是的, 我們喜歡那樣宫静。

這發(fā)生了什么走净? 我們在類上使用 does 是干什么用的? role 定義中的所有方法都被拷貝到類定義中孤里。因?yàn)樗且粋€拷貝操作, 所以我們可以使用盡可能多的類伏伯。

所以, 我們做的是: 當(dāng)我們想重用方法的時候把方法放進(jìn) roles 里面。

但是好處不止這一點(diǎn)兒捌袜。至少有兩個好處:


my $hammer = Hammer.new;    # create a new hammer object
say $hammer ~~ Hammer;      # "Bool::True" -- yes, this we know
say $hammer ~~ Hammering;   # "Bool::True" -- ooh!

所以 $hammer 知道它遵守了(does)Hammering, 我們現(xiàn)在不僅知道了對象屬于哪個類, 還知道了對象并入了什么 role说搅。這很有用如果我們不確定我們處理的是什么類型的對象:


if $unkown_object ~~ Hammering {
    $unknown_object.hammer("砸在釘子上");     # will always work
}

一個類能一次接收幾個 roles 嗎? 是的, 它可以:


role Flying {
    method fly {
        say "Whooosh!";
    }
}

class FlyingHammer does Hammering does Flying { }

讓一個類像那樣遵守幾個 roles 引入了一個有意思的可能: 沖突, 當(dāng)來自兩個不同 roles 的兩個同名方法嘗試占領(lǐng)同一個類時虏等。這時會發(fā)生什么弄唧? 好吧, 至少有 3 種可能:

    1. 第一個 role 贏了适肠。 它的方法住進(jìn)了類中
    1. 最后一個 role 贏了。 它覆蓋了之前的方法
    1. 編譯失敗候引。沖突必須被解決迂猴。

這種情況下選項(xiàng) 3 應(yīng)該是正確答案。原因和之前相同: 因?yàn)轭惡凸こ淘絹碓烬嫶? 程序員可能意識不到兩個 role 之間在哪兒發(fā)生沖突背伴。所以我們標(biāo)記了它。


role Sleeping {
    method lie {
        say "水平躺下";
    }
}

role Lying {
    method lie {
        say "說謊...";
    }
}

class SleepingLiar does Sleeping does Lying { }    # 沖突!

下一個問題, 那么: 當(dāng)在類中有 role 沖突時, 我們怎么修復(fù)它峰髓? 簡單: 在類中自己定義一個同名的方法:


class SleepingLiar does Sleeping does Lying {
    method lie {
        say "Lying in my sleep....";
    }
}

如果你想從一個貼別的 role 中調(diào)用一個方法, 語法是這樣的:


class SleepingLiar does Sleeping does Lying {
    method lie {
        self.Sleeping::lie;
    }
}

這就是 roles傻寂。它們把可重用的行為混合進(jìn)類中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末携兵,一起剝皮案震驚了整個濱河市疾掰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌徐紧,老刑警劉巖静檬,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異并级,居然都是意外死亡拂檩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門嘲碧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來稻励,“玉大人,你說我怎么就攤上這事愈涩⊥椋” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵履婉,是天一觀的道長煤篙。 經(jīng)常有香客問我,道長毁腿,這世上最難降的妖魔是什么辑奈? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮狸棍,結(jié)果婚禮上身害,老公的妹妹穿的比我還像新娘。我一直安慰自己草戈,他們只是感情好塌鸯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著唐片,像睡著了一般丙猬。 火紅的嫁衣襯著肌膚如雪涨颜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天茧球,我揣著相機(jī)與錄音庭瑰,去河邊找鬼。 笑死抢埋,一個胖子當(dāng)著我的面吹牛弹灭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播揪垄,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼穷吮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了饥努?” 一聲冷哼從身側(cè)響起捡鱼,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酷愧,沒想到半個月后驾诈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溶浴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年乍迄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戳葵。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡就乓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拱烁,到底是詐尸還是另有隱情生蚁,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布戏自,位于F島的核電站邦投,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏擅笔。R本人自食惡果不足惜志衣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望猛们。 院中可真熱鬧念脯,春花似錦、人聲如沸弯淘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至假勿,卻和暖如春借嗽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背转培。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工恶导, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浸须。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓惨寿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親删窒。 傳聞我的和親對象是個殘疾皇子缤沦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Object Orientation in Perl 6 Perl 6 有很多預(yù)先定義好的類型,這些類型可以歸為 ...
    焉知非魚閱讀 467評論 0 1
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法易稠,類相關(guān)的語法,內(nèi)部類的語法包蓝,繼承相關(guān)的語法驶社,異常的語法,線程的語...
    子非魚_t_閱讀 31,625評論 18 399
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,095評論 25 707
  • 2009 有用的和有意思的循環(huán) 讓我們來看一個基本的例子. 這是一個最簡單清晰的語法的例子.在這并沒有使用括號來包...
    焉知非魚閱讀 549評論 0 0
  • 22年12月更新:個人網(wǎng)站關(guān)停测萎,如果仍舊對舊教程有興趣參考 Github 的markdown內(nèi)容[https://...
    tangyefei閱讀 35,181評論 22 257