ruby語言本身並沒有提供abstract class和abstract method機制。這是ruby的spirit所決定的。但如果我們真的需要定義乙個公共抽象類(或者抽象方法)來讓子類來實現,又該如何做呢?
我們可以通過在呼叫方法時丟擲
notimplementederror來防止方法被呼叫。如(來自《ruby cookbook》的例子):
.new(
"##area是抽象方法")
<
shape2d
length
)@length
=length
@length**2
父類shape2d的方法area就是我們所需要的「抽象方法」了。你不能直接呼叫:
s1=shape2d
.new
s1.area
這樣呼叫將丟擲錯誤:
shape2d#area是抽象方法 (notimplementederror)
shape2d的子類
square覆寫了此方法。由此我們模擬實現了抽象方法。那麼抽象類該如何實現呢?自然而然,我們想到如果把類的initialize方法這樣處理,那麼這樣的類將沒辦法被new生成,不正是我們所需要的抽象類?說幹就幹:
def initialize
.new(
"##area是抽象類")
.new(
"##area是抽象方法")
當你呼叫shape2d.new時,直譯器將提示你:
shape2d是抽象類(notimplementederror)
我們已經實現了抽象方法和抽象類,感覺還是不夠好,對每乙個需要實現抽象類的類來說,我們都需要去寫一句:raise notimplementederror.new...實在不夠爽。ruby鼓勵我們去修改類的行為,甚至是標準庫,那好,我們修改class類吧,提供類似attr_reader的宣告式服務:
class class
def
abstract(
*args)
args
.eachdo|
method_name
|define_method(method_name)
do|*
args
|ifmethod_name ==:
initialize
msg ="
#是抽象類
"else
msg ="
###是抽象方法
".new(msg)
ok,如此一來,我們的shape2d可以寫成:
abstract
:initialize
,:area
#initialize和area是抽象方法
end
儘管在ruby中,抽象類和抽象方法是否有用存在懷疑,不過知道這樣的辦法總是不錯的主意
c 抽象類和抽象方法實現
抽象類 abstract abstract修飾符可以和類 方法 屬性 索引器及事件一起使用。1 抽象類不能被例項化。2 抽象類可以包含抽象方法和抽象訪問器。3 抽象類不能用sealed修飾符,此修飾符會阻止其他類從該類繼承。4 抽象類派生的非抽象類必須包括繼承的所有抽象方法和抽象訪問器的實現。5 抽...
抽象方法和抽象類
思想 利用通用介面建立的一種基本形式,以此表示所有匯出類的共同部分 概念 1 抽象方法 僅有宣告,沒有方法體 2 抽象類 含抽象方法的類 要點 抽象類可以不含抽象方法 抽象類不能被例項化 不能使用 new 關鍵字 子類繼承抽象父類而不提供方法定義,則子類也必須為抽象類 抽象類可以包含屬性 方法 構造...
抽象方法和抽象類
1.什麼是抽象方法 定義 乙個方法如果沒有方法體 乙個方法不使用 直接使用分號結束的方法,才是沒有方法體的方法 則這個方法就是抽象方法 一 宣告乙個方法,不適用 而直接分號結束 二 如果是抽象方法,必須使用 abstract 抽象關鍵字來修飾 三 不是抽象類,不可以使用抽象方法 2.什麼是抽象類 一...