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

來源:互聯網
上載者:User

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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.