1.先看私人方法能否被繼承
class A @@name="Anleb" def ask puts @@name end private :askenda=A.new#a.aska.send(:ask)class B < A endb=B.new#b.askb.send(:ask)
結論:對於private方法,是被繼承的,類變數(類似於靜態變數,屬於所有執行個體),也是可以被繼承的。
2.看類的方法能否被繼承
題外話:private影響誰?
class A private def self.ask puts "class method1" end class << self def play puts "class method2" end end def tell puts "instance methods" endendA.askA.send(:ask)A.playA.send(:play)a=A.new#a.tella.send(:tell)
結論:可以看到Private隻影響執行個體方法,對類的方法沒有影響,要想設定類的private方法,必須在類的單件類中設定。如下
class << self private def play puts "class method2" end end
進入正題,類的方法是否能繼承
class A private def self.ask puts "class method1" end class << self private def play puts "class method2" end end def tell puts "instance methods" endendclass B < A endB.askB.send(:play)
結論:類的方法也是能繼承的,如果看過元編程應該知道B的祖先鏈:B-A-A的單件類-Object-Kernel-BaseObject
3.類本身的執行個體變數是否能繼承
class A @name="Anleb" class << self attr_accessor :name endendp A.nameclass B < A endp B.name輸出:Anlebnil
結論:說明類的執行個體變數是不繼承的,注意,這裡要區別於 類的對象的執行個體變數。
根據元編程的思路,就是:
對象包含:
對象對類的引用(指標)
對象的執行個體變數
對象的object_id
對象的狀態tainted和frozen狀態
類包含:
執行個體的方法
類變數
因為對象的執行個體變數是存在於對象中的,所有其他的對象無法從類中獲得這個執行個體變數。
4.super
class A attr_accessor :ob_name def initialize @ob_name="Anleb" endendp A.new.ob_nameclass B < A attr_accessor :ob_id def initialize @ob_id=1 endendp B.new.ob_name輸出:Anlebnil #這裡是Nil,是因為繼承了attr_accessor產生的魔法方法
說明:這裡不要誤解了,都說是覆蓋了父類A的initialize方法,其實不是的,因為對象調用方法的模式是:先向右-找到自己的類,然後再向上尋找自己的祖先類。
這裡沒有調用父類A的初始化方法,是因為,先找到了自己類B的初始化方法。
如果也繼承父類的同名方法呢?利用super
class A attr_accessor :ob_name def initialize @ob_name="Anleb" end def ask puts "A methods" endendp A.new.ob_nameclass B < A attr_accessor :ob_id def initialize @ob_id=1 super end def ask puts "B methods" super endendp B.new.ob_nameB.new.ask輸出:"Anleb""Anleb"B methodsA methods