继承心得

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

Note: 以上参考 modules.rb

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 相关方法。

最后更新于