理解Ruby继承

理解Ruby继承,ruby,inheritance,Ruby,Inheritance,我一直在阅读基础良好的RubyList,其中提到了类如何继承其超类的实例方法,以便类的对象能够调用这些实例方法。下面是一个例子: class C def run_instance_method puts "This is an instance method." end def C.run_class_method puts "This is a class method." end end class D < C end 以下是我对为什么会发生这种情况

我一直在阅读基础良好的RubyList,其中提到了类如何继承其超类的实例方法,以便类的对象能够调用这些实例方法。下面是一个例子:

class C
  def run_instance_method
    puts "This is an instance method."
  end
  def C.run_class_method
    puts "This is a class method."
  end
end

class D < C
end
以下是我对为什么会发生这种情况的猜测,请让我知道这是否是正确的理解。如果存在类d的实例d,并且您尝试运行d.run_instance_method,则该对象将搜索其方法查找路径,并查看该方法是在其单例类、自己的类还是在其超类中定义的。因为run_instance_方法是在类C中定义的,所以不会发生任何问题,并且会调用run_instance_方法。对于类对象D(它是C和object的子类),如果调用D.run\u class\u方法,它将再次检查D类对象的方法查找路径。同样,Ruby将在类对象C中找到它


这个推理准确吗?

不太准确。这里隐藏着另一个概念,称为
元类
特征类
。类方法继承自特征类。有关详细信息,请参阅。(如果不想全部阅读,只需在页面中搜索“类方法”。

类方法可以像实例方法一样被继承和重写。如果父类定义了一个类方法,子类将继承该方法。也就是说,如果您的子类没有定义它自己的类方法,那么它将从它的超类继承

建议:当使用显式接收器调用类方法时,应避免依赖继承。始终通过定义该类的类调用该类方法。否则,依赖您的代码的人将很难找到定义类方法的父类

回到您最初的假设:从子类调用类方法是可能的,因为类方法是
特征类的实例方法

class C
   # instance methods goes here
   class << self # open the eigenclass
   # class methods go here as instance methods of the eigenclass
   end
end
C类
#实例方法在这里

同学们,谢谢你们的解释。如果我的解释不正确,你能纠正我吗:基本上,所有类方法都作为实例方法驻留在它们的特征类中。如果类D继承自其超类C,那么类D的本征类也隐式继承自类C的本征类。正是由于这个原因,类对象D可以调用.run\u class\u方法。这准确吗?准确!当Ruby计算方法调用表达式时,首先必须确定需要调用哪个方法。这就是所谓的
方法查找
:首先在self类中搜索方法定义,如果没有找到方法,则在类父类等中搜索到链根。
class C
   # instance methods goes here
   class << self # open the eigenclass
   # class methods go here as instance methods of the eigenclass
   end
end