<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一区二区三区四区| 色偷偷女男人的天堂亚洲网| 特级毛片免费播放| 免费国产精品视频| 国产精品亚洲五月天高清| 国产传媒在线观看视频免费观看| 亚洲最大av资源站无码av网址| 免费人成在线观看69式小视频| 亚洲另类春色校园小说| av大片在线无码免费| 亚洲人成毛片线播放| 毛片免费在线视频| 亚洲av午夜国产精品无码中文字| 日本19禁啪啪无遮挡免费动图| 美女一级毛片免费观看 | 四虎精品视频在线永久免费观看| 亚洲嫩草影院久久精品| 最近2019免费中文字幕6| 亚洲制服丝袜在线播放| 免费的涩涩视频在线播放| 青青草国产免费国产是公开 | 日本不卡免费新一二三区| 免费无码一区二区| 久久精品国产亚洲av麻豆| 黄在线观看www免费看| 亚洲人成色在线观看| 免费黄色网址入口| 色多多A级毛片免费看| 亚洲av午夜成人片精品网站 | 成人伊人亚洲人综合网站222| 一级做a免费视频观看网站| 亚洲爆乳精品无码一区二区三区 | 免费国产黄网站在线看| 亚洲AV无码乱码国产麻豆穿越| 成人免费激情视频| 日韩久久无码免费毛片软件| 久久丫精品国产亚洲av不卡| 国产自产拍精品视频免费看| 成人久久免费网站| 亚洲乱人伦中文字幕无码| 亚洲一区AV无码少妇电影☆|