为什么在继承内部调用基类方法?

时间:2019-06-05 19:34:13

标签: ruby ruby-2.2

在基类的Input: (1, "day") Output: 1440 方法中,传递了子类,而是调用子类的self.inherited方法来调用基类方法。如果在其他地方的同一个类上调用相同的方法,则同样的事情会起作用

name

输出:

class A
 def self.name 
  "a"
 end

 def self.inherited(subclass)
  puts B.hash
  puts B.name
 end
end

class B < A
 def self.name 
  "b"
 end
end

puts B.hash
puts B.name

1 个答案:

答案 0 :(得分:3)

这里没有魔术。

当您声明B时,事情会按以下顺序发生(大致而言):

    创建了
  1. BClass的实例)(它继承了A的所有内容)。目前还没有任何具体内容。

  2. A.inherited挂钩被调用。

  3. B类已打开并处理。仅在这一点上,它具有自己的属性和方法(可在钩子内部创建的属性和方法除外)。

因此,当发生(2)时,name可用的唯一BA中定义的那个。

使用以下代码非常容易检查:

class A
  def self.name 
    "a"
  end

  def self.inherited(subclass)
    puts "B own methods, point 1: #{subclass.methods(false).join(', ')}"
  end
end

class B < A
  puts "B own methods, point 2: #{self.methods(false).join(', ')}"

  def self.name 
    "b"
  end

  puts "B own methods, point 3: #{self.methods(false).join(', ')}"
end

# B own methods, point 1: 
# B own methods, point 2: 
# B own methods, point 3: name

现在一切都清楚了,对吧?