在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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方法,是被继承的,类变量(类似于静态变量,属于所有实例),也是可以被继承的。 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 class A @name="Anleb" class << self attr_accessor :name end end p A.name class B < A end p B.name 输出: Anleb nil 结论:说明类的实例变量是不继承的,注意,这里要区别于 类的对象的实例变量。 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方法,其实不是的,因为对象调用方法的模式是:先向右-找到自己的类,然后再向上查找自己的祖先类。 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
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论