在Ruby中的类方法中,继承如何工作?

时间:2017-07-11 21:22:44

标签: ruby inheritance

class SuperClass
  def self.superclass_method
    puts "I am the superclass method."
    puts "self = #{self}"
  end
end

class SubClass < SuperClass
end

puts SubClass.singleton_class.instance_methods.include? :superclass_method # true
puts SuperClass.singleton_class.instance_methods.include? :superclass_method # true

这两个陈述都是真的。是否有两个相同方法的副本?一个在SubClass&#39;单身类和SuperClass中的另一个&#39;单身课?

运行此代码时,我希望第二个语句返回false,因为我认为ruby将使用SuperClass中定义的方法。单身课程。

这实际上是如何运作的?

2 个答案:

答案 0 :(得分:1)

该方法只有一个副本。

说明:

1。单例类是实例

SubClassSuperClass都是Class的实例。如果你在IRB中检查单例类,你会看到类似的东西:

> SuperClass.singleton_class
=> #<Class:SuperClass>
> SubClass.singleton_class
=> #<Class:SubClass>

SuperClass.singleton_classSubClass.singleton_class的祖先,就像SuperClassSubClass的祖先一样。换句话说:类也是实例(Class),并且使用相同的规则。

2。 instance_methods采用可选参数

这些规则说SubClass.singleton_class.instance_methods将返回每个可用的实例方法,无论哪个祖先定义它。如果您只想查看SubClass.singleton_class上定义的实例方法,则需要调用SubClass.singleton_class.instance_methods(false)

http://ruby-doc.org/core-2.4.1/Module.html#method-i-instance_methods

答案 1 :(得分:0)

class SuperClass
  def self.superclass_method
    puts "I am the superclass method."
    puts "self = #{self}"
  end
end

class SubClass < SuperClass
end

p SuperClass.singleton_class.instance_methods(false) # => [:superclass_method]
p SubClass.singleton_class.instance_methods(false) # => []

superclass_method实际上只在SuperClass.singleton_class中定义。默认情况下,instance_methods的参数为true,它显示超类中定义的方法以及调用它的类中定义的方法。通过传递它,false的参数只显示该类中定义的方法。