<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    ruby實現抽象類和抽象方法

    Posted on 2007-02-06 13:07 dennis 閱讀(1452) 評論(1)  編輯  收藏 所屬分類: 動態語言
    ruby語言本身并沒有提供abstract class和abstract method機制。這是ruby的spirit所決定的。但如果我們真的需要定義一個公共抽象類(或者抽象方法)來讓子類來實現,又該如何做呢?
    ??? 我們可以通過在調用方法時拋出NotImplementedError來防止方法被調用。如(來自《ruby cookbook》的例子):

    ?class?Shape2D
    ??def?area
    ????raise?NotImplementedError
    .new("#{self.class.name}#area是抽象方法")
    ??end
    end?
    class?Square?
    <?Shape2D
    ??def?initialize(
    length)
    ????
    @length?=?length
    ??end
    ??
    ??def?area
    ????
    @length?**?2
    ??end
    end


    ?? 父類
    Shape2D的方法area就是我們所需要的“抽象方法”了。你不能直接調用:

    s1=Shape2D.new
    s1
    .area

    這樣調用將拋出錯誤:Shape2D#area是抽象方法 (NotImplementedError)
    Shape2D的子類Square覆寫了此方法。由此我們模擬實現了抽象方法。那么抽象類該如何實現呢?自然而然,我們想到如果把類的initialize方法這樣處理,那么這樣的類將沒辦法被new生成,不正是我們所需要的抽象類?說干就干:

    ?class?Shape2D
    ??def?initialize
    ????raise?NotImplementedError
    .new("#{self.class.name}#area是抽象類")
    ??end
    ??def?area
    ????raise?NotImplementedError
    .new("#{self.class.name}#area是抽象方法")
    ??end
    end?


    當你調用Shape2D.new時,解釋器將提示你:Shape2D是抽象類(NotImplementedError)

    我們已經實現了抽象方法和抽象類,感覺還是不夠好,對每一個需要實現抽象類的類來說,我們都需要去寫一句:raise NotImplementedError.new...實在不夠爽。ruby鼓勵我們去修改類的行為,甚至是標準庫,那好,我們修改Class類吧,提供類似attr_reader的聲明式服務:
    class?Class
    ??def??
    ????abstract(
    *args)
    ????args
    .each?do?|method_name|
    ??????
    ??????define_method(method_name)?
    do?|*args|
    ????????
    if?method_name?==?:initialize???
    ??????????msg?
    =?"#{self.class.name}是抽象類"
    ????????
    else
    ??????????msg?
    =?"#{self.class.name}##{method_name}是抽象方法"
    ????????end
    ????????raise?NotImplementedError
    .new(msg)
    ????????
    ??????end
    ????end
    ??end
    end


    OK,如此一來,我們的Shape2D可以寫成:
    ?class?Shape2D
    ????abstract
    :initialize,:area??#initialize和area是抽象方法
    ?end


    盡管在ruby中,抽象類和抽象方法是否有用存在懷疑,不過知道這樣的辦法總是不錯的主意

    評論

    # re: ruby實現抽象類和抽象方法  回復  更多評論   

    2007-02-06 20:01 by rubycainiao
    連句柄的類型都沒有了,還要多態干什么呢?
    主站蜘蛛池模板: 亚洲性色高清完整版在线观看| 亚洲人妻av伦理| 久久精品国产精品亚洲毛片| 一区二区免费电影| 亚洲乱亚洲乱少妇无码| 色老头综合免费视频| yy6080亚洲一级理论| 无忧传媒视频免费观看入口| 亚洲狠狠爱综合影院婷婷| 在线播放免费人成视频网站 | 久久狠狠爱亚洲综合影院| 免费A级毛片无码A∨免费| 亚洲最大黄色网站| 成年人免费网站在线观看| 精品国产_亚洲人成在线| jjzz亚洲亚洲女人| 99麻豆久久久国产精品免费| 亚洲av无码专区在线播放| 一级毛片**不卡免费播| 亚洲国产视频网站| 免费观看日本污污ww网站一区| 一个人晚上在线观看的免费视频| 亚洲精品成人片在线观看精品字幕 | 亚洲av无码成人精品区一本二本| 国产又粗又长又硬免费视频| 一级毛片大全免费播放下载| 久久国产亚洲精品麻豆| 亚洲免费观看在线视频| 风间由美在线亚洲一区| 伊人久久大香线蕉亚洲| 中文字幕免费在线| 国产精品亚洲专区无码不卡| 亚洲啪啪AV无码片| 无码专区永久免费AV网站| 特黄aa级毛片免费视频播放| 亚洲αv在线精品糸列| 女人张腿给男人桶视频免费版 | 久久国产乱子伦精品免费不卡| 亚洲激情电影在线| 亚洲av无码国产精品色在线看不卡| 久久精品视频免费看|