<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
    連句柄的類型都沒有了,還要多態干什么呢?
    主站蜘蛛池模板: 中文字幕久无码免费久久| 亚洲人成77777在线观看网| 亚洲精品一级无码鲁丝片| 在线免费观看韩国a视频| 日韩激情无码免费毛片| 成年女人色毛片免费看| 毛片免费全部播放一级| 午夜成人免费视频| 日本免费v片一二三区| 国产gav成人免费播放视频| 亚洲AV无码不卡在线观看下载| 免费观看国产小粉嫩喷水| 亚洲av无码不卡私人影院| 久久亚洲色一区二区三区| 久久精品国产精品亚洲艾草网| 亚洲一本综合久久| 亚洲精品**中文毛片| 亚洲香蕉久久一区二区三区四区| 亚洲色大成网站www永久网站| 综合一区自拍亚洲综合图区| 免费福利在线观看| 最新久久免费视频| 中文字幕免费观看| 成人片黄网站A毛片免费| 免费在线观看亚洲| 亚洲精品无码高潮喷水在线| 亚洲美女视频一区| 亚洲JIZZJIZZ妇女| 中文字幕不卡高清免费| 四虎成年永久免费网站| 国产在线观看免费完整版中文版| 久久亚洲AV无码西西人体| 亚洲AV无码乱码国产麻豆 | 免费毛片a在线观看67194| 成年人免费网站在线观看| 一本久久综合亚洲鲁鲁五月天 | AA免费观看的1000部电影| 国产乱人免费视频| 亚洲AV无码成人精品区蜜桃| 精品亚洲成A人无码成A在线观看 | 亚洲第一网站免费视频|