<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亚洲一区2区| 亚洲一区二区三区无码中文字幕| 亚洲宅男永久在线| 日本免费污片中国特一级| 亚洲AV中文无码乱人伦下载| 两个人日本免费完整版在线观看1| 亚洲一区视频在线播放| 一区二区视频免费观看| 怡红院亚洲怡红院首页| 在线免费观看伊人三级电影| 亚洲国产精品成人精品无码区在线| 国内精品一级毛片免费看| 亚洲国产成人久久综合一 | 亚洲一区二区三区免费视频| 中国在线观看免费高清完整版| 亚洲精品无码国产片| 四虎国产精品免费久久影院| 一级毛片高清免费播放| 亚洲AV综合色区无码一区爱AV| 99久久人妻精品免费二区| 日本亚洲精品色婷婷在线影院| 国产成人涩涩涩视频在线观看免费 | 香港a毛片免费观看| 亚洲乱码卡一卡二卡三| 国产成人免费高清在线观看| 免费福利在线观看| 久久久久久亚洲Av无码精品专口| 免费国产黄线在线观看| 一级做性色a爰片久久毛片免费| 亚洲午夜久久影院| 国产免费观看黄AV片| 国产成人免费ā片在线观看老同学| 亚洲毛片基地日韩毛片基地| 国产美女无遮挡免费视频| 成人性生交大片免费看中文| 中日韩亚洲人成无码网站| 亚洲综合久久夜AV | 皇色在线视频免费网站| 久久久久久毛片免费看| 亚洲一级毛片免费看| 亚洲一区无码中文字幕|