莊周夢蝶
生活、程序、未來
::
首頁
:: :: ::
聚合
::
管理
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
主站蜘蛛池模板:
亚洲性色高清完整版在线观看
|
亚洲人妻av伦理
|
久久精品国产精品亚洲毛片
|
一区二区免费电影
|
亚洲乱亚洲乱少妇无码
|
色老头综合免费视频
|
yy6080亚洲一级理论
|
无忧传媒视频免费观看入口
|
亚洲狠狠爱综合影院婷婷
|
在线播放免费人成视频网站
|
久久狠狠爱亚洲综合影院
|
免费A级毛片无码A∨免费
|
亚洲最大黄色网站
|
成年人免费网站在线观看
|
精品国产_亚洲人成在线
|
jjzz亚洲亚洲女人
|
99麻豆久久久国产精品免费
|
亚洲av无码专区在线播放
|
一级毛片**不卡免费播
|
亚洲国产视频网站
|
免费观看日本污污ww网站一区
|
一个人晚上在线观看的免费视频
|
亚洲精品成人片在线观看精品字幕
|
亚洲av无码成人精品区一本二本
|
国产又粗又长又硬免费视频
|
一级毛片大全免费播放下载
|
久久国产亚洲精品麻豆
|
亚洲免费观看在线视频
|
风间由美在线亚洲一区
|
伊人久久大香线蕉亚洲
|
中文字幕免费在线
|
国产精品亚洲专区无码不卡
|
亚洲啪啪AV无码片
|
无码专区永久免费AV网站
|
特黄aa级毛片免费视频播放
|
亚洲αv在线精品糸列
|
女人张腿给男人桶视频免费版
|
久久国产乱子伦精品免费不卡
|
亚洲激情电影在线
|
亚洲av无码国产精品色在线看不卡
|
久久精品视频免费看
|