ruby的 繼承和多型

2021-08-26 11:33:09 字數 1919 閱讀 9253

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來...

繼承和多型

類還有乙個重要的特性就是繼承,什麼是繼承?它又有什麼作用呢?繼承最主要的目的就是為了擴充套件原類的功能,加強或改進原類所沒有定義的屬性及方法。例如我們有狗這個類,可是狗的種類還是有很多,比如說博美狗,聖伯納,柴犬等等,如果只用狗一種類來定義所有種類狗的屬性及方法,那麼用這個類所產生出來的物件一定會有...