为什么在继承内部调用 base class 方法?
Why base class method is being called inside inherited?
在baseclass的self.inherited
方法中,传递subclass,调用subclass的name
方法,而不是调用baseclass 方法。虽然同样的事情有效如果在其他地方
的相同class上调用相同的方法
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
输出:
1428955046062147697
a
1428955046062147697
b
这里没有魔法。
当您声明 B
时,事情会按以下顺序发生(粗略地说):
B
(Class
的实例)被创建(它继承了 A
的所有内容)。目前它没有任何具体内容。
A.inherited
钩子被调用。
B
class 已打开并处理。只有在这一点上,它才获得自己的属性和方法(除了可以在钩子内部创建的那些)。
因此,当 (2) 发生时,唯一可用于 B
的 name
是 A
中定义的 name
。
使用以下代码很容易检查:
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
现在一切都清楚了吧?
在baseclass的self.inherited
方法中,传递subclass,调用subclass的name
方法,而不是调用baseclass 方法。虽然同样的事情有效如果在其他地方
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
输出:
1428955046062147697
a
1428955046062147697
b
这里没有魔法。
当您声明 B
时,事情会按以下顺序发生(粗略地说):
B
(Class
的实例)被创建(它继承了A
的所有内容)。目前它没有任何具体内容。A.inherited
钩子被调用。B
class 已打开并处理。只有在这一点上,它才获得自己的属性和方法(除了可以在钩子内部创建的那些)。
因此,当 (2) 发生时,唯一可用于 B
的 name
是 A
中定义的 name
。
使用以下代码很容易检查:
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
现在一切都清楚了吧?