C < B < A 有时候之所以 B 要 extend A 并不是为了 B 自己使用,而仅仅是为了方便 C
继承关系及 ancestors
父类和模块都有此方法,子类没有(重写)此方法,执行顺序:模块按被加载的顺序逆序,最后到父类。
module A
def do_something
puts 'A -> do_something'
super
end
end
module B
def do_something
puts 'B -> do_something'
super
end
end
module C
def do_something
puts 'C -> do_something'
super
end
end
class Parent
def do_something
puts 'Parent -> do_something'
end
end
class Child < Parent
include A
include B
include C
end
p Child.ancestors
# => [Child, C, B, A, Parent, Object, Kernel, BasicObject]
Child.new.do_something
# 输出 =>
#
# C -> do_something
# B -> do_something
# A -> do_something
# Parent -> do_something
inherited 方法
inherited(subclass)
当前类定义子类时,就会触发此回调。 (类似 Module.html#included)
举例:
class Foo
def self.inherited(subclass)
puts "New subclass: #{subclass}"
end
end
class Bar < Foo
end
class Baz < Bar
end
输出:
New subclass: Bar
New subclass: Baz
另:继承于一个类,父类的类方法就是子类的类方法,父类的实例方法就是子类的实例方法。
extend 方法
这里专指:一个对象继承一个模块。作用是:给一个对象添加实例方法(会覆盖原有方法)。
module Mod
def hello
"Hello from Mod.\n"
end
end
class Klass
def hello
"Hello from Klass.\n"
end
end
k = Klass.new
k.hello #=> "Hello from Klass.\n"
k.extend(Mod) #=> #<Klass:0x401b3bc8>
k.hello #=> "Hello from Mod.\n"
ActiveSupport::Cache 里就用这种方式给 Store 实例对象添加了 Local Cache 相关方法。