ruby類繼承中的方法繼承

2021-08-29 09:14:33 字數 752 閱讀 4581

c# **

}   

class a   

}   

class b : a   

}   

}  這段程式的輸出結果是ab

結果都不陌生,把這段程式用ruby重寫

ruby **

class a   

def initialize   

puts "a"

endend

class b < a   

def initialize   

puts "b"

endend

這段程式的輸出是b,並非我想像中的ab

奇怪麼?不奇怪,ruby的類在例項化的時候並不會去主動呼叫父類中的建構函式,也就是說,父類和子類的關係僅僅在於父類為子類提供一些可使用的方法而已,這些方法實際上放在父類自身的方法表或者父類單例類的方法表中:

ruby **

class a   

end

在上面定義的這個類a的方法表中,沒有儲存任何方法,它所有的通過a.methods看到的方法,都是通過爬繼承樹得來的。當收到乙個方法呼叫的訊息時,ruby類首先會查詢自己的方法表,若方法表中沒有,就會沿著繼承樹向上爬,去祖宗類中去找,所以,當我們呼叫a.new的時候,就會沿著繼承關係到object,kernel等裡面去找這個new方法和initialize方法,在之前b繼承a的例子中就可以看到,因為b本身的方法表中已經具有了initialize這個方法,new呼叫就不會去爬繼承樹找a中的initialize方法。

ruby的繼承到底可以繼承哪些東西

1.先看私有方法能否被繼承 class a name anleb def ask puts name endprivate ask enda a.new a.ask a.send ask class b a endb b.new b.ask b.send ask 結論 對於private方法,是被繼...

python 中類繼承的super 方法

參考 python中的super 方法主要用於子類引用父類方法,因為這樣做可以提高 的復用性 usr bin env python coding utf 8 用於測試類繼承的super 方法 class a object 父類 def init self,a,b self.a a self.b b ...

類的繼承 多繼承

多繼承要注意很多地方,以下 只是最基本多繼承方式,下面會講到多繼承的基本格式和繼承方法 簡單說明 1 如果在子類中需要父類的構造方法就需要顯示的呼叫父類的構造方法,或者不重寫父類的構造方法。2 在呼叫基類的方法時,需要加上基類的類名字首,且需要帶上 self 引數變數。區別在於類中呼叫普通函式時並不...