莊周夢蝶
生活、程序、未來
::
首頁
:: :: ::
聚合
::
管理
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
連句柄的類型都沒有了,還要多態干什么呢?
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
詳解Clojure的遞歸(上)—— 直接遞歸及優化
Clojure的并發(一) Ref和STM
Clojure的dosync是正則序?
Clojure Hacking Guide
閉包使用的一個陷阱
Ruby Fiber指南(五): 實現Actor,兼談Erlang的process調度
Actor、Coroutine和Continuation的概念澄清
Ruby Fiber指南(四)迭代器
Ruby Fiber指南(三)過濾器
Ruby Fiber指南(二)參數傳遞
Powered by:
BlogJava
Copyright © dennis
公告
關于我
隨筆分類
Android相關
C#歷程(13)
Clojure(43)
erlang(16)
Hadoop與分布式(16)
java(176)
linux & C(25)
my open-source(100)
node.js(5)
unix網絡編程(6)
web開發(13)
動態語言(81)
小毅同學二三事(1)
工作流(5)
工作隨筆(9)
工具和命令(4)
數據庫技術(14)
數據結構與算法(26)
模式與架構(30)
涂鴉(141)
源碼解讀(28)
移動開發(1)
計算機科學與基礎(56)
軟件工程(6)
友情鏈接
About me
Clojure中文技術社區
xmemcached
多背一公斤
夢想風暴
淘寶Java中間件
美味書簽
美味書簽團隊博客
美味愛讀
邢紅瑞的blog
阿寶的blog
阿歡的blog
最新隨筆
1.?博客搬遷
2.?Another URL Shortener using NodeJS
3.?Clojure中文專業技術社區
4.?Ring.velocity:render velocity templates for ring in clojure
5.?Clojure筆記:用好type hint
6.?Clojure世界:利用HouseMD診斷clojure
7.?分布式消息中間件Metaq發布1.4.3
8.?如何熟悉一個開源項目?
9.?Emacs + Clojure配置的幾個Tip
10.?clj.monitor : monitoring applications in clojure based on SSH
搜索
最新評論
1.?vitamind28448
評論內容較長,點擊標題查看
--Good post. I learn something totally new and chall
2.?re: Aviator——讓表達式飛起來
很好用,剛用到最近的一個項目中
--welcomezhang
3.?re: Java字符串的最大長度
寫得很好
--zzz
4.?clashofclanshack1155
Very clean site, thanks for this post.
--Very clean site, thanks for this post.
5.?binaryrobot89773
評論內容較長,點擊標題查看
--Howdy! I simply wish to offer you a big thumbs up
主站蜘蛛池模板:
中文字幕久无码免费久久
|
亚洲人成77777在线观看网
|
亚洲精品一级无码鲁丝片
|
在线免费观看韩国a视频
|
日韩激情无码免费毛片
|
成年女人色毛片免费看
|
毛片免费全部播放一级
|
午夜成人免费视频
|
日本免费v片一二三区
|
国产gav成人免费播放视频
|
亚洲AV无码不卡在线观看下载
|
免费观看国产小粉嫩喷水
|
亚洲av无码不卡私人影院
|
久久亚洲色一区二区三区
|
久久精品国产精品亚洲艾草网
|
亚洲一本综合久久
|
亚洲精品**中文毛片
|
亚洲香蕉久久一区二区三区四区
|
亚洲色大成网站www永久网站
|
综合一区自拍亚洲综合图区
|
免费福利在线观看
|
最新久久免费视频
|
中文字幕免费观看
|
成人片黄网站A毛片免费
|
免费在线观看亚洲
|
亚洲精品无码高潮喷水在线
|
亚洲美女视频一区
|
亚洲JIZZJIZZ妇女
|
中文字幕不卡高清免费
|
四虎成年永久免费网站
|
国产在线观看免费完整版中文版
|
久久亚洲AV无码西西人体
|
亚洲AV无码乱码国产麻豆
|
免费毛片a在线观看67194
|
成年人免费网站在线观看
|
一本久久综合亚洲鲁鲁五月天
|
AA免费观看的1000部电影
|
国产乱人免费视频
|
亚洲AV无码成人精品区蜜桃
|
精品亚洲成A人无码成A在线观看
|
亚洲第一网站免费视频
|