• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ruby的继承到底可以继承哪些东西

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1.先看私有方法能否被继承

class A
    @@name="Anleb"
    
    def ask 
        puts @@name
    end
    private :ask
end
a=A.new
#a.ask
a.send(:ask)

class B < A
    
end
b=B.new
#b.ask
b.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"
    end
end
A.ask
A.send(:ask)
A.play
A.send(:play)
a=A.new
#a.tell
a.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"
    end

end

class B < A
    
end
B.ask
B.send(:play)

 结论:类的方法也是能继承的,如果看过元编程应该知道B的祖先链:B-A-A的单件类-Object-Kernel-BaseObject

3.类本身的实例变量是否能继承

class A
    @name="Anleb"
    class << self
        attr_accessor :name
    end
end
p A.name
class B < A
    
end
p B.name

输出:
Anleb
nil

 结论:说明类的实例变量是不继承的,注意,这里要区别于 类的对象的实例变量。
根据元编程的思路,就是:
对象包含:
对象对类的引用(指针)
对象的实例变量
对象的object_id
对象的状态tainted和frozen状态

类包含:
实例的方法
类变量

因为对象的实例变量是存在于对象中的,所有其他的对象无法从类中获得这个实例变量。
4.super

class A
    attr_accessor :ob_name
    def initialize
        @ob_name="Anleb"
    end
end
p A.new.ob_name
class B < A
    attr_accessor :ob_id
    def initialize
        @ob_id=1
    end
end
p B.new.ob_name
输出:
Anleb
nil #这里是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"
    end
end
p A.new.ob_name
class B < A
    attr_accessor :ob_id
    def initialize
        @ob_id=1
        super
    end
    def ask
        puts "B methods"
        super
    end
end
p B.new.ob_name
B.new.ask

输出:
"Anleb"
"Anleb"
B methods
A methods

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
在Windows上搭建Redis集群(基于Ruby)发布时间:2022-07-14
下一篇:
Ruby是否是AJAX请求判断发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap