class person
def initialize( name,age=18 )
@name = name
@age = age
@motherland = "china"
enddef talk
puts "my name is "+@name+", age is "[email protected]_s
if @motherland == "china"
puts "i am a chinese."
else
puts "i am a foreigner."
endend
attr_writer :motherland
endclass student < person
def talk
puts "i am a student. my name is "+@name+", age is "[email protected]_s
endend
class worker < person
def talk
puts "i am a worker. my name is "+@name+", age is "[email protected]_s
end
endp3=student.new("kaichuan",25);p3.talk
p4=student.new("ben");p4.talk
p5=worker.new("kaichuan",30);p5.talk
p6=worker.new("ben");p6.talk
worker 類與 student 類同樣繼承自 person 類,親緣關係是兄弟,當他們 talk
時,能準確表明自己身份,因為他們都重寫了各自的 talk方法。 不同的子類繼承乙個父類,不僅子類和父類的行為有變異,而且子類彼此的行為也有差異,這就是多型。
用「 < 」表示 student 類是 person 類的子類。person 類的一切,student 類都能
繼承。但是 student 類重寫了 talk 方法,所以我們看到了不同的執行結果。子類繼
承父類的時候,除了重寫方法;也可以新增一些新的方法;或是增強父類的方法(用
關鍵字 super指明)。
ruby語言只支援單繼承,每乙個類都只能有乙個直接父類。這樣避免了多繼承的複雜度。但同時,ruby提供了mixin的機制可以用來實現多繼承。
可以使用super關鍵字呼叫物件父類的方法,當super省略引數時,將使用當前方法的引數來進行呼叫。
class base
def meth(info)
puts "this is base #"
endend
class derived < base
def meth(info)
puts "this is derived #"
super
endend
obj1 = derived.new
obj1.meth("test")
執行結果為:
this is derived test
this is base test
如果傳入的引數被修改再呼叫super的話,那麼將會使用使用修改後的值。
class base
def meth(info)
puts "this is base #"
endend
class derived < base
def meth(info)
puts "this is derived #"
info = "over"
super
endend
obj1 = derived.new
obj1.meth("test")
執行結果為:
this is derived test
this is base over
繼承和多型
物件導向程式設計時有乙個非常重要的原則 write once only once 編寫一次,且僅編寫一次 如果沒有繼承這種機制我們可能要重複寫很多 下面來看一下繼承 一 繼承 1 子類如果繼承父類必須使用extends這個關鍵字 2 子類呼叫父類的構造方法使用super關鍵字,也可以通過super來...
繼承和多型
物件導向程式設計時有乙個非常重要的原則 write once only once 編寫一次,且僅編寫一次 如果沒有繼承這種機制我們可能要重複寫很多 下面來看一下繼承 一 繼承 1 子類如果繼承父類必須使用extends這個關鍵字 2 子類呼叫父類的構造方法使用super關鍵字,也可以通過super來...
繼承和多型
類還有乙個重要的特性就是繼承,什麼是繼承?它又有什麼作用呢?繼承最主要的目的就是為了擴充套件原類的功能,加強或改進原類所沒有定義的屬性及方法。例如我們有狗這個類,可是狗的種類還是有很多,比如說博美狗,聖伯納,柴犬等等,如果只用狗一種類來定義所有種類狗的屬性及方法,那麼用這個類所產生出來的物件一定會有...