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

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值